在 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
超过 productID
和 month
。您的窗口函数计算 SUM
超过 productID
。 SQL 仍然需要“规则”如何通过productID
和month
(分组依据)计算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