उचित समाधान
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
करता है।
वापस करने के लिए0
NULL
. के बजाय बाहरी मेंSELECT
,COALESCE(some_count, 0) AS some_count
. का उपयोग करें . मैनुअल। -
अधिक सामान्य समाधान या मनमाने समय अंतराल . के लिए इस निकट से संबंधित उत्तर पर विचार करें:
- Rails+Postgres में मनमाने समय अंतराल द्वारा रिकॉर्ड गिनने का सबसे अच्छा तरीका