Du kan gøre det med en underforespørgsel, hvis dine versioner af PostgreSQL (endnu) ikke tillader vinduesfunktioner):
WITH t (month, marketid, totalsold, totalshipped, lefttoship_thismonth) AS(VALUES ('01-01-2015'::date, 1, 100, 50, 50), ('01-01-2015) '::dato, 2, 10, 3, 7), ('01-01-2015'::dato, 3, 0, 0, 0), ('01-02-2015'::dato, 1, 0 , 50, -50), ('01-02-2015'::dato, 2, 20, 0, 20), ('01-02-2015'::dato, 3, 0, 0, 0) )VÆLG month, marketid, totalsold, totalshipped, lefttoship_thismonth, (SELECT sum(lefttoship_thismonth) FROM t t2 WHERE t2.marketid =t1.marketid AND t2.month <=t1.month ) AS total_leftFROM t t1ORDER BY month, marketid
ville give dig følgende resultat:
|------------+-----------+----------+------- -------+-----------------------------+--------|| måned | markedsid | samlet solgt | samlet afsendt | lefttoship_thismonth | total_left ||----------------------------------- ---+-----------------------------+------------|| 01-01-2015 | 1 | 100 | 50 | 50 | 50 ||----------------------------------- ---+-----------------------------+------------|| 01-01-2015 | 2 | 10 | 3 | 7 | 7 ||----------------------------------- ---+-----------------------------+------------|| 01-01-2015 | 3 | 0 | 0 | 0 | 0 ||----------------------------------- ---+-----------------------------+------------|| 2015-01-02 | 1 | 0 | 50 | -50 | 0 ||----------------------------------- ---+-----------------------------+------------|| 2015-01-02 | 2 | 20 | 0 | 20 | 27 ||----------------------------------- ---+-----------------------------+------------|| 2015-01-02 | 3 | 0 | 0 | 0 | 0 ||----------------------------------- ---+-----------------------+------------|
Hvis du kan bruge vinduesfunktioner (som er mere effektive), kan du gøre følgende:
SELECT month, marketid, totalsold, totalshipped, lefttoship_thismonth, (sum(lefttoship_thismonth) OVER (OPDELING EFTER marketid ORDER BY month ROWS UNBOUNDED PRECEDING) ) AS total_leftFROM t t1ORDER BY month, marketid;
Hvis din måned
kolonne er en varchar (ikke en god idé), du kan caste den til dato eller bruge to_date
fungere.