date
एक आरक्षित शब्द
है मानक SQL में और PostgreSQL में डेटा प्रकार का नाम। PostgreSQL इसे पहचानकर्ता के रूप में अनुमति देता है, लेकिन यह इसे एक अच्छा विचार नहीं बनाता है। मैं thedate
का उपयोग करता हूं इसके बजाय कॉलम नाम के रूप में।
सरोगेट आईडी में अंतराल की अनुपस्थिति पर भरोसा न करें। यह लगभग हमेशा एक बुरा विचार है। ऐसी आईडी को बिना अर्थ के अद्वितीय संख्या के रूप में मानें , भले ही इसमें कुछ अन्य विशेषताएं हों अधिकांश समय ।
इस विशेष मामले में, @ के रूप में क्लोडोआल्डो ने टिप्पणी की
, thedate
एक आदर्श प्राथमिक कुंजी और कॉलम id
. प्रतीत होता है बस क्रुफ़्ट है - जिसे मैंने हटा दिया:
CREATE TEMP TABLE tbl (thedate date PRIMARY KEY, rainfall numeric);
INSERT INTO tbl(thedate, rainfall) VALUES
('2002-05-06', 110.2)
, ('2002-05-07', 56.6)
, ('2002-05-09', 65.6)
, ('2002-05-10', 75.9);
क्वेरी
क्वेरी द्वारा पूरी तालिका:
SELECT x.thedate, t.rainfall -- rainfall automatically NULL for missing rows
FROM (
SELECT generate_series(min(thedate), max(thedate), '1d')::date AS thedate
FROM tbl
) x
LEFT JOIN tbl t USING (thedate)
ORDER BY x.thedate
@a_horse_with_no_name
के समान पोस्ट किया गया है, लेकिन सरलीकृत किया गया है और काटे गए id
. को अनदेखा कर दिया गया है ।
तालिका में पाई गई पहली और अंतिम तिथि के बीच के अंतराल को भरता है। यदि लीडिंग/लैगिंग गैप हो सकते हैं, तो तदनुसार विस्तार करें। आप date_trunc()
का उपयोग कर सकते हैं जैसे @Clodoaldo
प्रदर्शित - लेकिन उनकी क्वेरी सिंटैक्स त्रुटियों से ग्रस्त है और सरल हो सकती है।
INSERT अनुपलब्ध पंक्तियाँ
इसे करने का सबसे तेज़ और सबसे पठनीय तरीका है NOT EXISTS
विरोधी अर्ध-जुड़ना।
INSERT INTO tbl (thedate, rainfall)
SELECT x.thedate, NULL
FROM (
SELECT generate_series(min(thedate), max(thedate), '1d')::date AS thedate
FROM tbl
) x
WHERE NOT EXISTS (SELECT 1 FROM tbl t WHERE t.thedate = x.thedate)