Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 为一列选择具有前n个计数的记录_Sql_Postgresql_Aggregate Functions_Greatest N Per Group - Fatal编程技术网

Sql 为一列选择具有前n个计数的记录

Sql 为一列选择具有前n个计数的记录,sql,postgresql,aggregate-functions,greatest-n-per-group,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为top n计数的记录。比如说,在本例中,ID的前2个计数分别为2和4。 因此,数据集应为: ID A B 2 x x 2 x x 2 x x 4 x x 4 x x 我的第一个想法是通过计算Topn计数来创建一个新

我正在使用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为top n计数的记录。比如说,在本例中,ID的前2个计数分别为2和4。 因此,数据集应为:

ID  A  B
2   x  x
2   x  x   
2   x  x
4   x  x
4   x  x
我的第一个想法是通过计算Topn计数来创建一个新视图,然后将新视图的ID与原始表的ID进行匹配,谢谢 但是,查询将永远运行,因为存在需要花费大量时间


我想知道是否有更好的方法来执行此操作?

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

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;

您可以查看。

这应该比使用窗口函数的两个子查询级别简单得多,速度也快得多

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

如前所述,您需要一个索引才能使其非常快速。如果id是您的主键,则一切都已设置。

谢谢!我将结束我的查询,现在运行40分钟,并尝试这个。我只是编辑了它一点,因为这里有3个t,但它们有不同的用途。第一个t表示原始表,而另两个t看起来像临时表名。@JohnSmith。我只是在没有更好的名称可供使用的情况下,对表和别名使用t。在最内部的查询中,您可以从t进行写入,查询的其余部分也可以工作。不知是否有更好的方法来实现这一点?现在:你做了什么?为什么这么糟糕?让我们看看!:完全重复。@wildplasser:我觉得那一个不像是重复的。@wildplasser我在这里过度简化了问题,以免混淆人们。我的实际任务是处理数百万条记录的数据,这就是为什么没有创建索引的存在根本无法完成这项工作的原因。我在Q.Gordon的回答中清楚地说了这一点。这正好解决了问题。我不知道该怎么办,这就是我来这里的原因。另外,请仔细阅读Q,然后再争辩它是一个完整的副本。OQ没有显示任何努力。没有模式,没有查询,只有提到这个词。戈登的查询对你有好处,这完全是巧合,伊姆霍。如果你的数据是10*那么大,事情可能会有所不同。简化事情并不能使事情变得简单,它只会使人困惑。