我正在使用 Netezza SQL。
我有下表(my_table):
type var1 var2 date_1 date_2
a 5 0 2010-01-01 2009-2010
a 10 1 2010-01-15 2009-2010
a 1 0 2010-01-29 2009-2010
a 5 0 2010-05-15 2010-2011
a 10 1 2010-05-25 2010-2011
b 2 0 2011-01-01 2010-2011
b 4 0 2011-01-15 2010-2011
b 6 1 2011-01-29 2010-2011
b 1 1 2011-05-15 2011-2012
b 5 0 2011-05-15 2011-2012
这里,date_2 是 date_1 的“四月到四月”年份。例如。 date_1 = 2010-01-01 介于 2009 年 4 月 1 日至 2010 年 4 月 1 日之间,因此 date_2 = 2009-2010。
我的问题:
最终结果应该是这样的:
type month_position date_2 cumsum_var1 cumsum_var2
1 a 10 2009-2010 16 1
2 a 2 2010-2011 15 1
3 b 10 2009-2010 12 1
4 b 2 2010-2011 6 1
我想我知道如何进行累计总和:
select (var1) over (partition by type, date_2 order by date_1 rows between unbounded preceding and current row) as cumulative_var1;
我知道“month_position”变量可以使用 CASE WHEN 语句来完成:
select case
when month(date_1) = 4 then 1,
when month(date_1) = 5 then 2,
when month(date_1) = 6 then 3,
....
when month(date_1) = 3 then 12
end as month_position;
但我不确定如何组装最终查询。
有人可以告诉我该怎么做吗?
谢谢!
关于:
SELECT
type,
1 + (8 + month(date_1)) % 12 as month_position,
date_2,
SUM(var1) OVER (PARTITION BY type, date_2 ORDER BY (8 + month(date_1)) % 12) as cumsum_var1,
SUM(var2) OVER (PARTITION BY type, date_2 ORDER BY (8 + month(date_1)) % 12) as cumsum_var2
FROM my_table
(8 + month(date_1)) % 12
是问题的SELECT CASE
的简短版本,其中大部分工作都是通过模数完成的(返回值从四月的 0 到三月的 11)。使其简短使其更易于使用。