对一列具有前n个计数的SELECT记录

时间:2013-06-07 22:04:42

标签: sql postgresql aggregate-functions greatest-n-per-group

我正在使用postgresql 9.2。

我有这样的数据集:

ID  A   B
1   x   x  
2   x   x 
2   x   x
2   x   x
3   x   x
4   x   x
4   x   x

我想显示ID最高的ID记录。比如,前两个ID计数 - 在这种情况下,ID = 2和4。 所以数据集应该是:

ID  A  B
2   x  x
2   x  x   
2   x  x
4   x  x
4   x  x

我的第一个想法是通过计算前n个计数来创建新视图,然后将新视图的ID与原始表的ID匹配,感谢this
但是,查询会永远运行,因为EXISTS需要很长时间。

我想知道是否有更好的方法来做到这一点?

2 个答案:

答案 0 :(得分:4)

您可以使用嵌套窗口函数执行此操作:

select t.id, t.a, t.b
from (select t.*, dense_rank() over (order by idcnt desc, id) as seqnum
      from (select t.*, count(*) over (partition by id) as idcnt
            from t
           ) t
     ) t
where seqnum <= 2;

您可以查看SQLFiddle

答案 1 :(得分:2)

这应该比具有窗口函数的两个子查询级别更加简单和快速。

SELECT *
FROM   t
JOIN  (
   SELECT id
   FROM   t
   GROUP  BY 1
   ORDER  BY count(*) DESC
   LIMIT  2
   ) top2 USING (id)

如前所述,您需要一个非常快的索引。如果id是您的主键,那么您已经完成了设置。