PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Skumulowana suma wartości według miesiąca, uzupełnianie brakujących miesięcy

Jest to bardzo podobne do innych pytań, ale najlepsze zapytanie jest nadal trudne.

Zapytanie podstawowe aby szybko uzyskać sumę bieżącą:

SELECT to_char(date_trunc('month', date_added), 'Mon YYYY') AS mon_text
     , sum(sum(qty)) OVER (ORDER BY date_trunc('month', date_added)) AS running_sum
FROM   tbl
GROUP  BY date_trunc('month', date_added)
ORDER  BY date_trunc('month', date_added);

Trudną częścią jest wypełnienie brakujących miesięcy :

WITH cte AS (
   SELECT date_trunc('month', date_added) AS mon, sum(qty) AS mon_sum
   FROM   tbl
   GROUP  BY 1
   )
SELECT to_char(mon, 'Mon YYYY') AS mon_text
     , sum(c.mon_sum) OVER (ORDER BY mon) AS running_sum
FROM  (SELECT min(mon) AS min_mon FROM cte) init
     , generate_series(init.min_mon, now(), interval '1 month') mon
LEFT   JOIN cte c USING (mon)
ORDER  BY mon;

niejawny CROSS JOIN LATERAL wymaga Postgresa 9.3+. Zaczyna się od pierwszego miesiąca w tabeli.
Aby zacząć od danego miesiąca :

WITH cte AS (
   SELECT date_trunc('month', date_added) AS mon, sum(qty) AS mon_sum
   FROM   tbl
   GROUP  BY 1
   )
SELECT to_char(mon, 'Mon YYYY') AS mon_text
     , COALESCE(sum(c.mon_sum) OVER (ORDER BY mon), 0) AS running_sum
FROM   generate_series('2015-01-01'::date, now(), interval '1 month') mon
LEFT   JOIN cte c USING (mon)
ORDER  BY mon;

Skrzypce SQL.

Oddzielenie miesięcy od różnych lat. Nie prosiłeś o to, ale najprawdopodobniej będziesz tego chciał.

Zwróć uwagę, że „miesiąc” w pewnym stopniu zależy od ustawienia strefy czasowej bieżącej sesji! Szczegóły:

Powiązane:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Najczęstsze scenariusze awarii PostgreSQL

  2. Jak zwrócić wiele wierszy z funkcji PL/pgSQL?

  3. Zapytanie Rails Postgres, wybierające tylko elementy, które pojawiają się we wszystkich parametrach wyszukiwania z asocjacjami

  4. Nie znaleziono języka proceduralnego C PostgreSQL

  5. Asynchroniczny DBAppender z logbackiem