我有一张桌子
dated abc def gh jkl
01.05.2016 2 12 23 16
02.05.2016 11 7 5 8
03.05.2016 6 4 9 1
Run Code Online (Sandbox Code Playgroud)
.......
从这个表我想创建一个表作为
dated abc def gh jkl
01.05.2016 2 12 23 16
02.05.2016 13 19 28 24
03.05.2016 19 23 37 25
Run Code Online (Sandbox Code Playgroud)
......
所以,实际上我想要添加所有值,但仅适用于小于所选日期的日期...我如何实现这一目标.
它看起来像运行总计,你可以使用windowed SUM:
SELECT dated
,SUM(abc) OVER(ORDER BY dated) AS abc
,SUM(def) OVER(ORDER BY dated) AS def
,SUM(gh) OVER(ORDER BY dated) AS gh
,SUM(jkl) OVER(ORDER BY dated) AS jkl
FROM t
ORDER BY dated;
Run Code Online (Sandbox Code Playgroud)
输出:
??????????????????????????????????????????????
? dated ? abc ? def ? gh ? jkl ?
??????????????????????????????????????????????
? 05.01.2016 00:00:00 ? 2 ? 12 ? 23 ? 16 ?
? 05.02.2016 00:00:00 ? 13 ? 19 ? 28 ? 24 ?
? 05.03.2016 00:00:00 ? 19 ? 23 ? 37 ? 25 ?
??????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)
编辑:
,如何获得计数,如第一行,count是1,第二行是2作为另一列,依此类推......
你可以使用COUNT或ROW_NUMBER():
SELECT ...
,COUNT(*) OVER(ORDER BY dated) AS cnt
Run Code Online (Sandbox Code Playgroud)
我可以使用一些计算...比如sum(abc)over(按日期排序)/ count()100/3作为NMU
是的,你可以做一整套计算.但请注意,某些操作必须用派生表(CTE /子查询)包装:
sum(abc) over (order by dated)/COUNT(*) OVER(ORDER BY dated)*100.0/3 as NMU
Run Code Online (Sandbox Code Playgroud)
编辑:
除了一件事之外,它的工作正常,只有月份或季度,这意味着加法只能持续到月底,所以当月/季改变时,价值应从头开始
然后你需要按(年,月)或(年,季)进行分区:
SELECT dated
,SUM(abc) OVER(PARTITION BY EXTRACT(year from dated),
EXTRACT(month from dated) ORDER BY dated) AS abc
Run Code Online (Sandbox Code Playgroud)
要么:
SELECT dated,
,SUM(abc) OVER(PARTITION BY to_char(dated, 'YYYY Q') ORDER BY dated) AS abc
Run Code Online (Sandbox Code Playgroud)