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 पोस्टग्रेज 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 फ़ंक्शन / संग्रहीत कार्यविधि CURRENT_TIMESTAMP नहीं बदलता है

  2. पोस्टग्रेज 9.2 . में ROWID समकक्ष

  3. अनुक्रमों पर पोस्टग्रेस्क्ल अगला प्रश्न

  4. डेटाबेस में मिलियन टेबल बनाएं?

  5. SQL में प्रतिशत/कुल कैसे करें?