konto usunięte

Temat: [postgresql] Suma narastająco - ciągłość

Dla uproszczenia założmy, ze mam tabelę z 2 kolumnami: data i wartość. Wyciągam zapytaniem sumę narastająco:


date | value
------------------------
2014-01-01 | 10
2014-01-02 | 13
2014-01-04 | 15
2014-01-07 | 20

select distinct date, sum(value)
over (order by date)
from table

date | value
------------------------
2014-01-01 | 10
2014-01-02 | 23
2014-01-04 | 38
2014-01-07 | 58


Działa dobrze, ale przez to, że daty nie są ciągłe, wykres zbudowany na takich danych nie jest ładny.
Czy jest możliwość dodania rekordu z datą i wartością z poprzedniego dnia dla jakiejść brakującej daty tylko po to by zasymulować ciągłość danych i uzyskać coś takiego:


date | value
------------------------
2014-01-01 | 10
2014-01-02 | 23
2014-01-03 | 23
2014-01-04 | 38
2014-01-05 | 38
2014-01-06 | 38
2014-01-07 | 58

konto usunięte

Temat: [postgresql] Suma narastająco - ciągłość

Krzysztof K.:
Dla uproszczenia założmy, ze mam tabelę z 2 kolumnami: data i wartość. Wyciągam zapytaniem sumę narastająco:


date | value
------------------------
2014-01-01 | 10
2014-01-02 | 13
2014-01-04 | 15
2014-01-07 | 20

select distinct date, sum(value)
over (order by date)
from table

date | value
------------------------
2014-01-01 | 10
2014-01-02 | 23
2014-01-04 | 38
2014-01-07 | 58


Działa dobrze, ale przez to, że daty nie są ciągłe, wykres zbudowany na takich danych nie jest ładny.
Czy jest możliwość dodania rekordu z datą i wartością z poprzedniego dnia dla jakiejść brakującej daty tylko po to by zasymulować ciągłość danych i uzyskać coś takiego:


date | value
------------------------
2014-01-01 | 10
2014-01-02 | 23
2014-01-03 | 23
2014-01-04 | 38
2014-01-05 | 38
2014-01-06 | 38
2014-01-07 | 58
A nie lepiej zrobić to postronnie wykresu? Po stronie SQLa nie będzie to proste.

konto usunięte

Temat: [postgresql] Suma narastająco - ciągłość

Po stronie SQLa to jest całkiem proste:

Dla tabeli:
CREATE TABLE a (d DATE, value INTEGER) ;


Twoje zapytanie wygląda tak:
SELECT DISTINCT d, SUM(value)
OVER (ORDER BY d) v
FROM a
ORDER BY d ASC;


I wtedy zapytanie pokazujące dane jak chcesz, wygląda np. tak:
WITH y AS 
(
SELECT DISTINCT d, SUM(value)
OVER (ORDER BY d) v
FROM a
)
SELECT g.d,
(SELECT v FROM y WHERE y.d <= g.d ORDER BY d DESC LIMIT 1)
FROM
(SELECT generate_series(min(d), max(d), '1 day')::date d FROM y) g
ORDER BY d ASC;

konto usunięte

Temat: [postgresql] Suma narastająco - ciągłość

Tomek P.:
A nie lepiej zrobić to postronnie wykresu? Po stronie SQLa nie będzie to proste.

Zwykle można, ale niestety engine do wykresów jaki mam, taki mam i muszę to zrobić w sql-u.

Następna dyskusja:

zapytanie w PostgreSQL




Wyślij zaproszenie do