PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Tổng các giá trị tích lũy theo tháng, điền vào các tháng còn thiếu

Điều này rất giống với các câu hỏi khác, nhưng câu hỏi tốt nhất vẫn là câu hỏi phức tạp.

Truy vấn cơ bản để nhận được số tiền đang chạy một cách nhanh chóng:

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

Phần khó khăn là điền vào các tháng còn thiếu :

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;

ẩn CROSS JOIN LATERAL yêu cầu Postgres 9.3+. Điều này bắt đầu với tháng đầu tiên trong bảng.
Để bắt đầu với một tháng nhất định :

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.

Giữ các tháng từ các năm khác nhau. Bạn không yêu cầu điều đó, nhưng rất có thể bạn sẽ muốn nó.

Lưu ý rằng "tháng" ở một mức độ nào đó phụ thuộc vào cài đặt múi giờ của phiên hiện tại! Chi tiết:

Có liên quan:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Triển khai bộ lọc tìm kiếm cho tất cả các cột

  2. Tại sao PostgreSQL kết hợp chuỗi sai cách?

  3. Làm cách nào để di chuyển dữ liệu từ bảng này sang bảng khác trong quá trình di chuyển đường ray?

  4. Rails không khôi phục giao dịch sau khi lưu không thành công ()

  5. pgbackups trên Heroku không tìm thấy