Question
What is the best or most expressive way to write SQL Query that selects
current row and sum of previous row withing a group
For example, given a table with columns Id, Group, Amount, how to calculate PreviousAmount
Result:
| Id | Group | Amount | PreviousAmount* |
|---|---|---|---|
| 1 | 1 | 2 | NULL |
| 2 | 1 | 2 | 2 |
| 3 | 1 | 2 | 4 |
| 4 | 2 | 2 | NULL |
I've tried:
SELECT
*,
SUM(Amount) OVER (PARTITION BY Group ORDER BY ID RANGE UNBOUNDED PRECEDING) as Prev
FROM Table
but it also includes current row
CodePudding user response:
Here how to do it :
SELECT
*,
SUM(Amount) OVER (PARTITION BY [Group] ORDER BY ID ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) as Prev
FROM mytable
ROWS UNBOUNDED PRECEDING means the frame's lower bound is simply infinite.
1 PRECEDING represent the row before the current row, it is the higher bound within the partition.
CodePudding user response:
The simplest way is to use default range and to substract the current row amount
select *, SUM(Amount) OVER (PARTITION BY [Group] ORDER BY ID) - Amount as Prev
from tbl
