2

我正在使用 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

我想显示具有前 n 个计数的 ID 的记录。比如说,前 2 个 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 进行匹配,谢谢。但是
,查询永远运行,因为 EXISTS 需要大量时间。

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

4

2 回答 2

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

于 2013-06-07T22:07:49.103 回答
2

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

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

如前所述,您需要一个索引才能真正快速。如果id是你的主键,你就都设置好了。

于 2013-06-07T23:47:09.680 回答