我已经广泛搜索了这个问题的答案。我正在使用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”列的查询(无论是第一行还是最后一行都不会打扰我)。所以这会给我:
+--------+---------+-------------+-------------+
| ID | NUMBER | COUNTRY | LANG |
+--------+---------+-------------+-------------+
| 1 | 3968 | UK | English |
| 4 | 1234 | Greece | Greek |
这是如何实现的?
答案 0 :(得分:53)
解决此类问题的一种非常典型的方法是使用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行。
答案 1 :(得分:34)
由于您不在乎,我为每个号码选择了最大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
答案 2 :(得分:0)
您将使用以下查询:
SELECT * FROM [table] GROUP BY NUMBER;
其中[table]
是表的名称。
这为NUMBER
列提供了唯一的列表,但其他列可能毫无意义,具体取决于供应商的实现;也就是说它们可能不会一起对应于特定的一行或多行。