如何在 Redshift SQL 中计算移动年度总计(滚动 12 个月)?
How do I calculate Moving Annual Total (Rolling 12 months) in Redshift SQL?
我在尝试创建一个新列来说明按市场和产品划分的滚动总和时遇到了麻烦。为简单起见,我只包含一个独特的市场和产品,这是我要实现的目标的简单示例:
我面临两个障碍:
- 日期会有重复行,请参阅黄色突出显示。
- 我试过的代码逻辑不起作用:
SELECT ,
TO_DATE(A.DATE
|| '01','YYYYMMDD') AS DATE_PERIOD ,
EXTRACT(YEAR FROM (TO_DATE(A.DATE
|| '01','YYYYMMDD'))) AS YEARS ,
EXTRACT(MONTH FROM (TO_DATE(A.DATE
|| '01','YYYYMMDD'))) AS MONTHS ,
A.PRODUCT AS PRODUCT ,
A.MARKET AS MKT ,
SUM(A.LOCAL_CURRENCY_VAL) OVER (PARTITION BY EXTRACT(YEAR FROM (TO_DATE(A.DATE
|| '01','YYYYMMDD'))),A.MARKET, A.PRODUCT ORDER BY EXTRACT(MONTH FROM (TO_DATE(A.DATE
|| '01','YYYYMMDD'))) ROWS BETWEEN 11 PRECEDING AND CURRENT ROW ) AS ROLLING_12
FROM MYTABLE AS A
GROUP BY ,
A.PRODUCT ,
A.LOCAL_CURRENCY_VAL ,
EXTRACT(YEAR FROM (TO_DATE(A.DATA_PERIOD
|| '01','YYYYMMDD'))) ,
EXTRACT(MONTH FROM (TO_DATE(A.DATA_PERIOD
|| '01','YYYYMMDD'))) ,
A.DATA_PERIOD
你快到了,你必须使用window函数,但你用错了。
让我们一步一步来,不要让查询过于复杂:
首先你说你有重复的日期行。让我们汇总这些值并删除重复项:
SELECT "date", market, product, sum(sales_value) as overall_sales_value
FROM my_table
GROUP BY date, market, product
如您所见,这非常简单,我们删除了重复的行。
现在让我们继续window函数的微积分。我们将使用前面查询的输出作为一个名为 my_sub_table
.
的新 table
SELECT "date", market, product, overall_sales_value,
sum(overall_sales_value) over (partition by market, product
order by "date"
rows between 11 preceding and current row)
FROM my_sub_table
这正是您想要的。在你的情况下,另一个问题是你将 date
列放在分区中,但这没有意义,因为你想要每个 market
和 product
的统计信息。关于 window 函数 here.
用法的更多详细信息
所以,最终查询:
SELECT "date", market, product, overall_sales_value,
sum(overall_sales_value) over (partition by market, product
order by "date"
rows between 11 preceding and current row)
FROM (SELECT "date", market, product, sum(sales_value) as overall_sales_value
FROM my_table
GROUP BY date, market, product) as my_sub_table
我在尝试创建一个新列来说明按市场和产品划分的滚动总和时遇到了麻烦。为简单起见,我只包含一个独特的市场和产品,这是我要实现的目标的简单示例:
我面临两个障碍:
- 日期会有重复行,请参阅黄色突出显示。
- 我试过的代码逻辑不起作用:
SELECT ,
TO_DATE(A.DATE
|| '01','YYYYMMDD') AS DATE_PERIOD ,
EXTRACT(YEAR FROM (TO_DATE(A.DATE
|| '01','YYYYMMDD'))) AS YEARS ,
EXTRACT(MONTH FROM (TO_DATE(A.DATE
|| '01','YYYYMMDD'))) AS MONTHS ,
A.PRODUCT AS PRODUCT ,
A.MARKET AS MKT ,
SUM(A.LOCAL_CURRENCY_VAL) OVER (PARTITION BY EXTRACT(YEAR FROM (TO_DATE(A.DATE
|| '01','YYYYMMDD'))),A.MARKET, A.PRODUCT ORDER BY EXTRACT(MONTH FROM (TO_DATE(A.DATE
|| '01','YYYYMMDD'))) ROWS BETWEEN 11 PRECEDING AND CURRENT ROW ) AS ROLLING_12
FROM MYTABLE AS A
GROUP BY ,
A.PRODUCT ,
A.LOCAL_CURRENCY_VAL ,
EXTRACT(YEAR FROM (TO_DATE(A.DATA_PERIOD
|| '01','YYYYMMDD'))) ,
EXTRACT(MONTH FROM (TO_DATE(A.DATA_PERIOD
|| '01','YYYYMMDD'))) ,
A.DATA_PERIOD
你快到了,你必须使用window函数,但你用错了。 让我们一步一步来,不要让查询过于复杂:
首先你说你有重复的日期行。让我们汇总这些值并删除重复项:
SELECT "date", market, product, sum(sales_value) as overall_sales_value
FROM my_table
GROUP BY date, market, product
如您所见,这非常简单,我们删除了重复的行。
现在让我们继续window函数的微积分。我们将使用前面查询的输出作为一个名为 my_sub_table
.
SELECT "date", market, product, overall_sales_value,
sum(overall_sales_value) over (partition by market, product
order by "date"
rows between 11 preceding and current row)
FROM my_sub_table
这正是您想要的。在你的情况下,另一个问题是你将 date
列放在分区中,但这没有意义,因为你想要每个 market
和 product
的统计信息。关于 window 函数 here.
所以,最终查询:
SELECT "date", market, product, overall_sales_value,
sum(overall_sales_value) over (partition by market, product
order by "date"
rows between 11 preceding and current row)
FROM (SELECT "date", market, product, sum(sales_value) as overall_sales_value
FROM my_table
GROUP BY date, market, product) as my_sub_table