我正在使用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需要很长时间。
我想知道是否有更好的方法来做到这一点?
答案 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
是您的主键,那么您已经完成了设置。