4

特定の列のみが重複している重複しないエントリを選択するための適切なステートメントを見つけるのに苦労しています。例として、次の表では、col1、col2、および col3 に一意の値を持つ行のみを考慮し、col4 と col5 の値は重要ではありません。これは、行 1 と行 2 を重複と見なし、行 4 と行 5 を重複と見なすことを意味します。

col1 col2 col3 col4 col5
 A    2    p    0    2
 A    2    p    1    8
 A    3    r    4    12
 B    0    f    3    1
 B    0    f    6    5

そして、私は次のものだけを選択したいと思います:

col1 col2 col3 col4 col5
 A    2    p    0    2
 A    3    r    4    12
 B    0    f    3    1

複数の DISTINCT ステートメントを組み合わせてこれを達成する方法、または行の重複を比較するときに無視する特定の列を指定する方法はありますか?

4

1 に答える 1

2

保持する行を選択する必要があります。これにはROW_NUMBER()関数を使用できます。

SELECT col1, col2, col3, col4, col5
FROM (SELECT *, ROW_NUMBER() OVER(PARTITION BY col1, col2, col3 ORDER BY col4 DESC) 'RowRank'
      FROM table
     )sub 
WHERE RowRank = 1

ORDER BYセクションを変更して、キープする列とトスする列を変更できます。ROW_NUMBER()関数は各行に番号を割り当てるだけです。この例では、 、 、 の各組み合わせを保持したいのでcol1col2それらcol3PARTITION BY組み合わせごとに番号付けが 1 から始まることを意味します。内部クエリだけを実行して、アイデアを得ることができます。

GROUP BYまたは、関数を使用して集計することもできます。つまり、次のようになります。

SELECT col1, col2, col3, MAX(col4), MAX(col5)
FROM table
GROUP BY col1, col2, col3

ここでの欠点は、MAX()ofcol4col5が異なる行に由来する可能性があるため、必ずしも元のテーブルから 1 つの行を返すとは限りませんが、どの行を返すかを気にしない場合は問題ありません。

于 2013-06-28T01:37:46.660 に答える