按特殊功能分组

abh*_*bhi 1 oracle

我有一张桌子

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)

......
所以,实际上我想要添加所有值,但仅适用于小于所选日期的日期...我如何实现这一目标.

Luk*_*zda 5

它看起来像运行总计,你可以使用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)

LiveDemo

输出:

??????????????????????????????????????????????
?        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作为另一列,依此类推......

你可以使用COUNTROW_NUMBER():

SELECT ...
  ,COUNT(*) OVER(ORDER BY dated) AS cnt
Run Code Online (Sandbox Code Playgroud)

LiveDemo2

我可以使用一些计算...比如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)