2016-05-05 2 views
1

У меня есть таблицагруппа по функции с особым

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 

.......

Из этой таблицы я хочу, чтобы создать таблицу как

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 

... ...
Итак, на самом деле я хочу, чтобы все значения добавлялись, но только для дат, меньших, чем выбранная дата ... Как это достичь.

ответ

5

Похоже, работает всего, вы могли бы использовать windowedSUM:

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; 

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 ║ 
╚═════════════════════╩═════╩═════╩════╩═════╝ 

EDIT:

, как получить количество, а также, как и для первой строки, счетчик равен 1, а для второго ряда это 2 в качестве еще одного столбца и так далее ....

Вы можете использовать COUNT или ROW_NUMBER():

SELECT ... 
    ,COUNT(*) OVER(ORDER BY dated) AS cnt 

LiveDemo2

можно использовать некоторые вычисления, а ... как сумма (а) по (порядка датированному)/COUNT () 100/3 в НМЕ

Да, вы можете сделать весь спектр расчетов.Но следует помнить, что некоторые операции должны быть обернуты производной таблицы (CTE/подзапроса):

sum(abc) over (order by dated)/COUNT(*) OVER(ORDER BY dated)*100.0/3 as NMU 

EDIT:

Это работает отлично, за исключением одной вещи, что сумма должна быть только в течение месяца, мудрый или четвертый, означает, что добавление должно продолжаться только до конца месяца, поэтому при изменении месяца/квартала значение должно начинаться с начала снова.

Затем вам нужно разделить на (год, месяц) или (год, квартал):

SELECT dated 
     ,SUM(abc) OVER(PARTITION BY EXTRACT(year from dated), 
            EXTRACT(month from dated) ORDER BY dated) AS abc 

или:

SELECT dated, 
     ,SUM(abc) OVER(PARTITION BY to_char(dated, 'YYYY Q') ORDER BY dated) AS abc 
+0

Спасибо за ответ ... вместе с ним, как получить счетчик как и для первой строки, счетчик равен 1, а для второй строки - 2 в качестве другого столбца и т. д .... – abhi

+0

с этой функцией 'over (order by)', могу ли я использовать некоторые вычисления ... как 'sum (abc) over (order by date)/count (*) * 100/3 как NMU' .. – abhi

+0

Он отлично работает, за исключением того, что сумма должна быть только на месяц или квартал мудрый, означает, что добавление будет продолжаться только до тех пор, пока конец месяца, поэтому при изменении месяца/квартала значение должно начинаться с начала снова (т. значение первого дня) ...... – abhi

Смежные вопросы