我想知道是否有一种简单的方法可以将查询限制在前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个窗口。
希望这是有道理的。
答案 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以获取这些窗口的所有行。
总而言之,这是一个非常复杂的查询。