PostgreSQL限制在WINDOW上

时间:2012-03-20 20:08:28

标签: postgresql limit result-partitioning

我想知道是否有一种简单的方法可以将查询限制在前n个窗口。

即。说我有类似的东西

SELECT field1
      ,field2
      ,field3
      ,sum(field2) over (partition by field1) sum2
      ,sum(field3) over (partition by field1) sum3
FROM table1
GROUP BY field1, field2, field3
ORDER BY sum2 DESC LIMIT 100

上面的查询返回前100个记录,而不是前100个窗口(这是有道理的)

我想得到的是前100个sum2窗口,即使该窗口内可能有多行。所以我可能会得到400条记录,但只有前100个窗口。

希望这是有道理的。

1 个答案:

答案 0 :(得分:1)

在评论之后再多考虑一下,我认为以下查询会做你想要的。

我选择查询产生的前100个“窗口”,并返回落入这些窗口的所有行。由于窗口由field1分区,因此实际上是具有最大field1的{​​{1}}的100个不同值。对于sum2上的关系,我的查询中的sum2获胜次数较大(您未指定)。

field1

关键点是在CTE中生成聚合值,从另一个CTE中选择100个获胜窗口(也可以使用DISTINCT,我选择WITH x AS ( SELECT field1 ,field2 ,field3 ,sum(field2) over w sum2 ,sum(field3) over w sum3 FROM table1 GROUP BY field1, field2, field3 WINDOW w AS (PARTITION BY field1) ) , y AS ( SELECT field1 FROM x GROUP BY sum2, field1 ORDER BY sum2 DESC, field1 DESC LIMIT 100 ) SELECT x.* FROM y JOIN x USING (field1) ORDER BY sum2 DESC, field1 DESC, field2 DESC, field3 DESC; / GROUP BY) ,并将结果返回到第一个CTE以获取这些窗口的所有行。

总而言之,这是一个非常复杂的查询。