Ini sangat mirip dengan pertanyaan lain, tetapi kueri terbaik masih rumit.
Kueri dasar untuk mendapatkan jumlah yang berjalan dengan cepat:
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);
Bagian yang sulit adalah mengisi bulan yang hilang :
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;
implisit CROSS JOIN LATERAL
membutuhkan Postgres 9.3+. Ini dimulai dengan bulan pertama dalam tabel.
Untuk memulai dengan bulan tertentu :
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;
Menjaga bulan dari tahun yang berbeda terpisah. Anda tidak memintanya, tetapi kemungkinan besar Anda menginginkannya.
Perhatikan bahwa "bulan" sampai tingkat tertentu tergantung pada pengaturan zona waktu sesi saat ini! Detail:
Terkait:
- Menghitung Jumlah Kumulatif di PostgreSQL
- PostgreSQL:menjalankan hitungan baris untuk kueri 'menurut menit'
- Fungsi jendela Postgres dan kelompokkan dengan pengecualian