2014-01-17 1 views
1

У меня есть набор данных, который имеет два уровня разбивки; пытаясь суммировать верхний уровень с помощью функции окна (кумулятивная сумма), но функции окна не группируют вывод в одну строку.Posgresql: возвращает одну строку с функцией окна

Данные выглядит следующим образом:

дате | верхний уровень a | a1 | название поля
дата | верхний уровень a | a2 | название поля
дата | верхний уровень b | b1 | название поля
дата | верхний уровень b | b2 | название поля
дата | верхний уровень b | b3 | поле для обобщения

Я делаю:

SUM(field_to_summarize) OVER (partition by top_level order by date) AS CumulativeSum 

Это возвращает то же CumulativeSum за верхний уровень на каждой строке, как вы видите выше. Как мне выполнить агрегацию по окну, но возвращать только одну строку на верхний уровень? Например:

дата | верхний уровень a | Суммарная сумма для
дата | верхний уровень b | Суммарная сумма для b

+0

Разве это не просто 'выберите top_level, сумма (field_to_summarize) форма my_table группы по заказу top_level по top_level'? Обратите внимание, что сумма суммарной суммы последней строки будет равна сумме всех значений вплоть до последней строки в подгруппе –

+0

. Это работает, если мне нужна только единовременная общая сумма. Но мне нужно также группировать по дате, чтобы ежемесячно работать. Любые другие мысли? – user3208423

+0

просто добавьте группу top_level – devanand

ответ

0

Вы хотите что-то ищите? Обратите внимание на вложенную функцию суммы внутри суммы() по()

create table myData(
date date 
,top_level text 
,second_level text 
,value int 
); 

insert into myData values('2012-12-01','A', 'A1', 12); 
insert into myData values('2012-12-01','A', 'A2', 19); 
insert into myData values('2012-12-01','B', 'B1', 10); 
insert into myData values('2012-12-01','B', 'B2', 15); 

insert into myData values('2013-01-01','A', 'A1', 10); 
insert into myData values('2013-01-01','A', 'A2', 7); 
insert into myData values('2013-01-01','B', 'B1', 20); 
insert into myData values('2013-01-01','B', 'B2', 35); 


select 
date 
,top_level 
,sum(value) as value_total 
,sum(sum(value))over(partition by top_level order by date) as value_running_total 
from myData 
group by date, top_level 
order by top_level, date; 

возвращается:

date; top_level; value_total; value_running_total 
"2012-12-01";"A";31;31 
"2013-01-01";"A";17;48 
"2012-12-01";"B";25;25 
"2013-01-01";"B";55;80 
+0

Я просто подходил сюда, чтобы уточнить, что я собираюсь попробовать что-то вроде этого, хотя мой метод был менее изящным. Попробуйте это сейчас. Будет обновлено позже. Благодаря! – user3208423

+0

Yeap. Это оно. Спасибо, Сашикант! – user3208423

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

  • Нет связанных вопросов^_^