3

我想知道是否有一种简单的方法可以将查询限制在前 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 个窗口。

希望这是有道理的。

4

1 回答 1

1

在评论并给予更多思考之后,我认为以下查询可以满足您的需求。

我选择查询产生的前 100 个“窗口”并返回所有落入这些窗口的行。由于窗口被划分为field1有效的 100 个不同的值,field1其中最大的sum2。在我的查询中sum2获得更大的field1胜利(您没有指定)。

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;

关键是在一个 CTE 中生成聚合值,从另一个 CTE 中的那些中挑选 100 个获胜窗口(也可以用 DISTINCT 完成,我选择了GROUP BY/ ORDER BY),并将结果连接回第一个 CTE 以获得所有这些窗口的行。

总而言之,这是一个相当复杂的查询。

于 2012-03-20T20:39:45.533 回答