web-dev-qa-db-ja.com

SQL-1つの列でのみ個別を選択

私はこの問題に対する答えを広く探しました。 Microsoft SQL Serverを使用していますが、次のようなテーブルがあるとします。

+--------+---------+-------------+-------------+
| ID     | NUMBER  | COUNTRY     | LANG        |
+--------+---------+-------------+-------------+
| 1      | 3968    | UK          | English     |
| 2      | 3968    | Spain       | Spanish     |
| 3      | 3968    | USA         | English     |
| 4      | 1234    | Greece      | Greek       |
| 5      | 1234    | Italy       | Italian     |

一意の 'NUMBER'列のみを選択する1つのクエリを実行したいです(最初の行であるか、最後の行であるかは気になりません)。だから、これは私に与えるでしょう:

+--------+---------+-------------+-------------+
| ID     | NUMBER  | COUNTRY     | LANG        |
+--------+---------+-------------+-------------+
| 1      | 3968    | UK          | English     |
| 4      | 1234    | Greece      | Greek       |

これはどのように達成できますか?

39
Jason Lipo

気にしないので、各番号に最大IDを選択しました。

select tbl.* from tbl
inner join (
select max(id) as maxID, number from tbl group by number) maxID
on maxID.maxID = tbl.id

クエリの説明

 select 
    tbl.*  -- give me all the data from the base table (tbl) 
 from 
    tbl    
    inner join (  -- only return rows in tbl which match this subquery
        select 
            max(id) as maxID -- MAX (ie distinct) ID per GROUP BY below
        from 
            tbl 
        group by 
            NUMBER            -- how to group rows for the MAX aggregation
    ) maxID
        on maxID.maxID = tbl.id -- join condition ie only return rows in tbl 
                                -- whose ID is also a MAX ID for a given NUMBER
34
Kyle Hale

このタイプの問題に対する非常に典型的なアプローチは、row_number()を使用することです。

select t.*
from (select t.*,
             row_number() over (partition by number order by id) as seqnum
      from t
     ) t
where seqnum = 1;

これは、最小IDとの比較を使用するよりも一般化できます。たとえば、order by newid()を使用してランダムな行を取得できます。 where seqnum <= 2を使用して2行を選択できます。

52
Gordon Linoff

次のクエリを使用します。

SELECT * FROM [table] GROUP BY NUMBER;

ここで、[table]はテーブルの名前です。

これにより、NUMBER列に一意のリストが提供されますが、ベンダーの実装によっては他の列は無意味になる場合があります。つまり、それらが一緒になって特定の行に対応しない場合があります。

0
Gedalya