私はこの問題に対する答えを広く探しました。 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 |
これはどのように達成できますか?
気にしないので、各番号に最大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
このタイプの問題に対する非常に典型的なアプローチは、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行を選択できます。
次のクエリを使用します。
SELECT * FROM [table] GROUP BY NUMBER;
ここで、[table]
はテーブルの名前です。
これにより、NUMBER
列に一意のリストが提供されますが、ベンダーの実装によっては他の列は無意味になる場合があります。つまり、それらが一緒になって特定の行に対応しない場合があります。