在 Amazon Redshift 中使用窗口函数时需要 GROUP BY 聚合

Posted

技术标签:

【中文标题】在 Amazon Redshift 中使用窗口函数时需要 GROUP BY 聚合【英文标题】:GROUP BY aggregate needed when using window function in Amazon Redshift 【发布时间】:2016-03-04 10:17:17 【问题描述】:

我需要一个表格,其中包含每个产品和每个月的 GP 总和,以及该产品从那时起的 GP 总和。虽然我已经为此找到了一个walkaroud,但这真的让我感到困惑,我希望在这里得到提示。

在 redshift 中,当我尝试像这样使用窗口 SUM 时:

CREATE TABLE "tmp.gp_sum" AS (
SELECT 
"productID",
"month",
SUM("gp") AS "gp_sum",
SUM("gp") OVER (PARTITION BY p."productID" ORDER BY "month" ROWS unbounded preceding) as "gp_runsum" 
FROM "products" 
GROUP BY "productID", "month"
); 

DB 返回一个错误,说“gp”需要在 GROUP BY 语句中,但这对我不起作用。我发现的唯一 walkaroud 是嵌套另一个聚合函数,这似乎工作正常 - 至少在这种情况下:

SUM(SUM("gp")) OVER (PARTITION BY p."productID" ORDER BY "month" ROWS 

谁能解释一下?

谢谢,托马斯

【问题讨论】:

【参考方案1】:
SELECT "productID", "month", SUM("gp") AS "gp_sum"
FROM "products" 
GROUP BY "productID", "month"

SUM 超过 productIDmonth。您的窗口函数计算 SUM 超过 productID。 SQL 仍然需要“规则”如何通过productIDmonth(分组依据)计算gp_runsum

您的解决方案 (SUM(SUM(...))) 应该可以工作,但您始终可以在单独的 sql 中计算运行总和,然后加入 productID

【讨论】:

【参考方案2】:

试试这个:

CREATE TABLE "tmp.gp_sum" AS
(
    SELECT   "productID",
             "month",
              SUM("gp") AS "gp_sum",
              SUM("gp") OVER (PARTITION BY p."productID" ORDER BY "month" ROWS unbounded preceding) as "gp_runsum" 
    FROM     "products" 
    GROUP BY "productID", "month", "gp"
); 

【讨论】:

【参考方案3】:
CREATE TABLE "tmp.gp_sum" AS (
    SELECT 
        "productID",
        "month",
        SUM("gp") OVER (PARTITION BY "productID", "month") AS "gp_sum",
        SUM("gp") OVER (PARTITION BY p."productID" ORDER BY "month" ROWS unbounded preceding) 
        as "gp_runsum" 
    FROM "products" 
);

【讨论】:

你能补充解释吗?

以上是关于在 Amazon Redshift 中使用窗口函数时需要 GROUP BY 聚合的主要内容,如果未能解决你的问题,请参考以下文章

使用 lambda 函数 nodejs 从 Amazon Redshift 查询选择

Amazon Redshift 中 LISTAGG 函数的替代方法

有用的 Amazon Redshift SQL 用户定义函数的任何示例?

没有函数或存储过程的 Amazon RedShift 中的 Upsert

如何在 AMAZON REDSHIFT 中将 userip 转换为整数

同时对 Amazon Redshift 和本地源运行查询