TOP 1与分组

时间:2013-07-16 19:55:25

标签: sql sql-server

我有以下表结构

person_id   organization_id
1            1
1            2
1            3
2            4
2            2

我希望结果集为

person_id     organization_id
1               1
2               4

表示person_id

的TOP 1

1 个答案:

答案 0 :(得分:1)

您正在使用SQL Server,因此您可以使用row_number()。但是,如果没有订购,您实际上无法定义top - 结果无法保证。

因此,以下内容将top没有order by

select person_id, min(organization_id)
from t
group by person_id;

但是,我假设您打算将行的顺序作为预期的顺序。唉,SQL表无序所以排序无效。您确实需要idcreationdate或其他来指定订单。

所有这些,您可以尝试以下方法:

select person_id, organization_id
from (select t.*,
             row_number() over (partition by person_id order by (select NULL)) as seqnum
      from t
     ) t
where seqnum = 1;

肯定保证可以正常工作。根据我的经验,order by (select NULL))以与select相同的顺序返回行 - 尽管没有这种效果的文档(我已经找到)。请注意,在大小合适的表上的并行系统中,SQL Server返回顺序与页面上的行顺序或插入顺序几乎没有关系。