postgresql中的聚合窗口函数输出(redshift)

时间:2015-03-19 17:56:16

标签: sql postgresql aggregate-functions amazon-redshift window-functions

我真的想将中位窗函数用作聚合函数。

我目前被迫在子选择中使用窗口函数,然后像这样聚合:

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语句?

1 个答案:

答案 0 :(得分:0)

严格来说,您的示例查询可以重写:

SELECT id,
    AVG(metric),
    MEDIAN(metric),
    COUNT(*)
FROM data_table
GROUP BY id;

但是我想知道你是否只是选择了一个在数学上能够简化的糟糕例子。这是一种特殊情况,因为子查询和主查询在同一个字段上聚合,而外部聚合从一组相同的值中选择最小值。

如果情况并非如此,并且您的实际查询和子查询按同一字段进行分组,则答案为否,您需要子查询有两个原因:

首先,通过ANSI定义,在 WHEREGROUP BYHAVING子句之后评估窗口函数。在窗口函数之后没有用于指定聚合所需行为的子句,因此必须使用子查询或CTE。

其次,即使您从OVER()子句中删除了窗口,您需要GROUP BY数据,只有在第一轮聚合完成后才知道