我真的想将中位窗函数用作聚合函数。
我目前被迫在子选择中使用窗口函数,然后像这样聚合:
SELECT id, MIN(avg) AS mean, MIN(median) AS median, COUNT(*)
FROM (
SELECT id, AVG(metric) OVER(PARTITION BY id), MEDIAN(metric) OVER(PARTITION BY id)
FROM data_table
)
GROUP BY id;
有没有办法聚合窗口函数结果,所以只有一个SELECT语句?
答案 0 :(得分:0)
严格来说,您的示例查询可以重写:
SELECT id,
AVG(metric),
MEDIAN(metric),
COUNT(*)
FROM data_table
GROUP BY id;
但是我想知道你是否只是选择了一个在数学上能够简化的糟糕例子。这是一种特殊情况,因为子查询和主查询在同一个字段上聚合,而外部聚合从一组相同的值中选择最小值。
如果情况并非如此,并且您的实际查询和子查询不按同一字段进行分组,则答案为否,您需要子查询有两个原因:
首先,通过ANSI定义,在 WHERE
,GROUP BY
和HAVING
子句之后评估窗口函数。在窗口函数之后没有用于指定聚合所需行为的子句,因此必须使用子查询或CTE。
其次,即使您从OVER()
子句中删除了窗口,您需要GROUP BY
数据,只有在第一轮聚合完成后才知道。