SQL:按月累计总和

问题描述 投票:0回答:1

我正在使用 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。

我的问题:

  • 对于 date_2 的每个唯一值中“type”的每个唯一值:我想取 var1 和 var2 的每月累积总和...以便累积总和针对 date_2 的下一个唯一值重新开始。
  • 请注意,第一个月始终是四月(而不是一月)。

最终结果应该是这样的:

  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;

但我不确定如何组装最终查询。

有人可以告诉我该怎么做吗?

谢谢!

sql netezza
1个回答
0
投票

关于:

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)。使其简短使其更易于使用。

© www.soinside.com 2019 - 2024. All rights reserved.