Đ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;
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:
- Tính Tổng tích lũy trong PostgreSQL
- PostgreSQL:số hàng đang chạy cho truy vấn 'theo phút'
- Chức năng cửa sổ Postgres và nhóm theo ngoại lệ