2

2 つの行の異なる組み合わせを選択するにはどうすればよいですか。

例えば。次の表が与えられた場合

Col1 Col2
A     B
A     B
A     C
C     B
B     A

選びたい

Col1 Col2
A      B
A      C
C      B

最後の行 B、A が含まれるため、distinct キーワードを使用するだけでは機能しないことに注意してください。

逆の組み合わせ (A,B) が既にセットに含まれているため、最後の行が返されないようにします。

4

4 に答える 4

1

上記の解決策のいずれも、問題に対する正しい答えを提供していないことに注意してください。

ここでは、使用できる 2 つの可能な答えを示します。

最初に「ベース テーブル」を生成します (注: いくつかのテスト ケースを追加しました)。

Declare @Test table (Column1 varchar(10), Column2 varchar(10))

Insert into @Test
VALUES ('A','B'),('A','B'),('A','C'),('C','B'),('B','A'),('D', 'A'), ('d','e'), ('a', 'b'), ('C','A')

select *  from @Test

これにより、次の結果が得られます。

Column1     Column2
A           B
A           B
A           C
C           B
B           A
D           A
d           e
a           b
C           A

クエリについては次のとおりです。

クエリ オプション 1:

;WITH numb as ( Select *, Num = ROW_NUMBER() Over(Order by Column1,Column2) from @Test)
, Num2 as ( Select T.*, n.Num from @Test t
        Inner Join numb n on (t.Column1 = n.Column1 and t.Column2 = n.Column2) or (t.Column1 = n.Column2 and t.Column2 = n.Column1))
,rankk as ( select *, rnk = rank() Over(partition by num order by Column1)  from Num2)

select DISTINCT Column1, Column2 from rankk where rnk = 1

結果 オプション 1:

Column1     Column2
a           b
A           C
C           B
D           A
d           e

クエリ オプション 2:

;WITH source AS ( SELECT Column1, Column2, 
      Test = (CASE WHEN Column1 < Column2 THEN Column1 ELSE Column2 END
             + CASE WHEN Column1 > Column2 THEN Column1 ELSE Column2 END)  
      FROM (
            SELECT Distinct Column1, Column2
            FROM @Test AS bd
      ) AS sub1
)
SELECT Column1 =  MIN(s.Column1), Column2 =  MAX(s.Column2)
FROM source AS s
GROUP BY s.Test;

結果 オプション 2:

Column1     Column2
A           B
A           C
D           A
C           B
d           e

注: 2 つのクエリの結果は若干異なりますが、どちらのクエリも同じ正しい結果セットを返します。

于 2016-03-23T13:31:21.517 に答える
0

以下の動作を確認しました。より多くのセットに対して機能させたい場合は、追加の NOT EXISTS ステートメントの組み合わせを含めます。

WITH BaseData
AS
    (SELECT Column1, Column2
    FROM (VALUES
        ('A', 'B'), ('A', 'B'), ('A', 'C'), ('C', 'B'), ('B', 'A')) val (Column1, Column2))
SELECT Column1, Column2
FROM
    (SELECT Column1, Column2
    FROM BaseData
    GROUP BY Column1, Column2) sub1
WHERE NOT EXISTS
    (SELECT 1
    FROM BaseData
    WHERE Column1 = Column2
    AND Column2 = Column1);
于 2013-05-15T00:00:17.300 に答える