2013-09-14 1 views
1

Учитывая следующие данные:Postgresql работает сумма предыдущих групп?

sequence | amount 
1   100000 
1   20000 
2   10000 
2   10000 

я хотел бы написать запрос SQL, который дает мне сумму текущей последовательности, плюс сумму предыдущей последовательности. Как так:

sequence | current | previous 
1 120000 0 
2 20000 120000 

Я знаю, что решение, вероятно, включает в себя функции управления окнами, но я не слишком уверен, как осуществить это без подзапросов.

ответ

3

SQL Fiddle

select 
    seq, 
    amount, 
    lag(amount::int, 1, 0) over(order by seq) as previous 
from (
    select seq, sum(amount) as amount 
    from sa 
    group by seq 
) s 
order by seq 
+0

Это та отстающая функция, которую я мог найти правильно зарегистрированной здесь http://www.postgresql.org/docs/9.2/static/functions-window.html. Большое спасибо. – Scott

+0

Какие еще варианты отставания, и что конкретно отстает от этого? Благодарю. – Scott

+0

На самом деле, повторное чтение документов для запаздывания дает понять это сейчас. Еще раз спасибо! – Scott

0

Если последовательность "sequencial" без отверстий, вы можете просто сделать:

SELECT t1.sequence, 
    SUM(t1.amount), 
    (SELECT SUM(t2.amount) from mytable t2 WHERE t2.sequence = t1.sequence - 1) 
FROM mytable t1 
GROUP BY t1.sequence 
ORDER BY t1.sequence 

В противном случае, вместо того, чтобы t2.sequence = t1.sequence - 1 вы могли бы сделать:

SELECT t1.sequence, 
    SUM(t1.amount), 
    (SELECT SUM(t2.amount) 
    from mytable t2 
    WHERE t2.sequence = (SELECT MAX(t3.sequence) 
         FROM mytable t3 
         WHERE t3.sequence < t1.sequence)) 
FROM mytable t1 
GROUP BY t1.sequence 
ORDER BY t1.sequence; 

Вы можете увидеть оба подхода в this fiddle