SQL-仅在一列上选择distinct
我已到处寻找这个问题的答案。我使用的是Microsoft SQL Server,假设我有一个如下所示的表:SQL-仅在一列上选择distinct,sql,sql-server,unique,distinct,Sql,Sql Server,Unique,Distinct,我已到处寻找这个问题的答案。我使用的是Microsoft SQL Server,假设我有一个如下所示的表: +--------+---------+-------------+-------------+ | ID | NUMBER | COUNTRY | LANG | +--------+---------+-------------+-------------+ | 1 | 3968 | UK | English |
+--------+---------+-------------+-------------+
| 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 |
这是如何实现的?既然你不在乎,我为每个数字选择了最大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
您将使用以下查询:
SELECT * FROM [table] GROUP BY NUMBER;
其中,[table]
是表的名称
这为
编号
列提供了一个唯一的列表,但是根据供应商的实施情况,其他列可能没有意义;也就是说,它们可能不一起对应于特定的一行或多行 解决此类问题的典型方法是使用行编号()
:
这比使用与最小id的比较更具普遍性。例如,您可以使用
orderbynewid()
获得一个随机行。您可以使用where-seqnum选择2行,但实际上并不清楚您想要什么。您想要一行(如您所问)还是两行(如第二个代码块)?还是每个国家都有一个数字?你真的在“各地”搜索这个吗?这是一个非常常见的查询。也是。。。而且。。。还有…还有。。。和。。(很抱歉挑剔你,但不是那么抱歉!)@Gedalya这只能在MySQL中实现。它将在SQL server中返回一个错误。无论如何,我没有因为这个原因而否决投票,而是因为对同一个表进行聚合的自连接会随着表变大而变得指数级的昂贵(从读取量来看),除了更灵活之外,它的效率也更高(或者至少不会更差)。它不是变得更昂贵了吗?你是如何得到“指数级”的?我先回答了,然后顿悟了。不管怎样,我也投票支持戈登的答案,因为大多数重复的都使用相同的窗口方法。对我来说似乎不起作用,也许我用错了。如果人们在回答SQL问题时对查询中发生的情况给出某种解释,那就太好了。否则很难从答案中学习。@RampantCreativeGroup我添加了一个解释,希望能有所帮助。
select t.*
from (select t.*,
row_number() over (partition by number order by id) as seqnum
from t
) t
where seqnum = 1;