目前是这样的,我写一段代码,做一些数据的累积值
比如
时间 值
201001 1
201002 1
201003 1
201004 1
201005 1
201006 1
201007 1
201008 1
201009 1
201010 1
201011 1
201021 1
201101 1
sum( 值) over (order by 时间 rows between unbounded preceding and current row)
发现这样不能跨年,不然 201101的值就是13而不是想要的1
问在还是用窗口函数的情况下能否实现,怎么实现
------解决思路----------------------
这是 oracle 的语法吧,还是 sqlserver 2012 (2014)的?
------解决思路----------------------
DECLARE @T TABLE([Date] DATE,Value INT)
INSERT INTO @T VALUES
('20100101',1),
('20100201',1),
('20100301',1),
('20100401',1),
('20100501',1),
('20100601',1),
('20100701',1),
('20100801',1),
('20100901',1),
('20101001',1),
('20101101',1),
('20101201',1),
('20110101',1)
SELECT [DATE],sum(Value) over (PARTITION BY YEAR([DATE]) order by [Date] rows between unbounded preceding and current row) FROM @T
------解决思路----------------------
这个应该是ORACLE的语法
这个可以根据年来PARTITION BY
------解决思路----------------------
这个开窗函数的功能,在sql server 2012开始支持,当然 在 oracle也有。
上面2 楼的用法是对的,增加一个 partition by year 就可以了,
sum( 值) over (partition by left(时间,4) order by 时间 rows between unbounded preceding and current row)
意思是 首先把 数据按照 取出的前4位,就是按照年来分组,这样就形成了一个窗口(有几年的数据,就会有几个窗口),然后 对于每一行数据按照时间先后进行排序,取出从窗口的第一行开始 到 当前行,就是一个 累积的 求和。