उचित समाधान
SELECT *
FROM (
SELECT day::date
FROM generate_series(timestamp '2007-12-01'
, timestamp '2008-12-01'
, interval '1 month') day
) d
LEFT JOIN (
SELECT date_trunc('month', date_col)::date AS day
, count(*) AS some_count
FROM tbl
WHERE date_col >= date '2007-12-01'
AND date_col <= date '2008-12-06'
-- AND ... more conditions
GROUP BY 1
) t USING (day)
ORDER BY day;
-
LEFT JOINका उपयोग करें , बिल्कुल। -
generate_series()मक्खी पर टाइमस्टैम्प की एक तालिका तैयार कर सकता है, और बहुत तेजी से। -
आमतौर पर पहले . को एकत्रित करना अधिक तेज़ होता है तुम सम्मलित हो। मैंने हाल ही में इस संबंधित उत्तर में sqlfiddle.com पर एक परीक्षण मामला प्रदान किया है:
- PostgreSQL - एक सरणी द्वारा क्रम
-
timestampकास्ट करें सेdate. तक (::date) एक बुनियादी प्रारूप के लिए। अधिक उपयोग के लिएto_char()। -
GROUP BY 1पहले आउटपुट कॉलम को संदर्भित करने के लिए सिंटैक्स शॉर्टहैंड है।GROUP BY dayहो सकता है साथ ही, लेकिन यह उसी नाम के मौजूदा कॉलम के साथ विरोध कर सकता है। याGROUP BY date_trunc('month', date_col)::dateलेकिन यह मेरे स्वाद के लिए बहुत लंबा है। -
date_trunc(). के लिए उपलब्ध अंतराल तर्कों के साथ काम करता है । -
count()कभी भीNULLउत्पन्न नहीं करता है (0पंक्तियों के बिना), लेकिनLEFT JOINकरता है।
वापस करने के लिए0NULL. के बजाय बाहरी मेंSELECT,COALESCE(some_count, 0) AS some_count. का उपयोग करें . मैनुअल। -
अधिक सामान्य समाधान या मनमाने समय अंतराल . के लिए इस निकट से संबंधित उत्तर पर विचार करें:
- Rails+Postgres में मनमाने समय अंतराल द्वारा रिकॉर्ड गिनने का सबसे अच्छा तरीका