PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Кумулативен сбор от стойности по месеци, попълване на липсващите месеци

Това е много подобно на други въпроси, но най-добрата заявка все още е трудна.

Основна заявка за да получите текущата сума бързо:

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);

Сложната част е да попълните липсващи месеци :

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;

имплицитно CROSS JOIN LATERAL изисква Postgres 9.3+. Това започва с първия месец в таблицата.
За да започнете с даден месец :

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;

SQL Fiddle.

Разграничаване на месеци от различни години. Не сте поискали това, но най-вероятно ще го искате.

Обърнете внимание, че „месецът“ до известна степен зависи от настройката на часовата зона на текущата сесия! Подробности:

Свързани:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL зададено поле на JSON обект в JSON масив

  2. Редовен израз в клауза LIKE на PostgreSQL

  3. PostgreSQL с Homebrew на Mac

  4. Невалиден брой и сума в кръстосана заявка с помощта на PostgreSQL

  5. JPA SequenceGenerator и GeneratedValue:име / свойството на генератора е уникално само за клас?