एक "एक चयन के भीतर चयन करें" इसे आमतौर पर "उप-चयन" या "सबक्वायरी" कहा जाता है आपके विशेष मामले में यह एक सहसंबंधित सबक्वेरी है . LATERAL
जॉइन (पोस्टग्रेज 9.3 में नया) बड़े पैमाने पर सहसंबद्ध उपश्रेणियों को अधिक लचीले समाधानों से बदल सकता है:
मुझे नहीं लगता कि आपको यहां किसी की जरूरत है।
आपके पहले मामले . के लिए यह क्वेरी शायद तेज़ और आसान है, हालांकि:
SELECT date, max(value) OVER (PARTITION BY grp) AS value
FROM (
SELECT *, count(value) OVER (ORDER BY date) AS grp
FROM test_fill_null
) sub;
count()
केवल गैर-शून्य मानों की गणना करता है, इसलिए grp
प्रत्येक गैर-शून्य value
के साथ वृद्धि की जाती है , जिससे वांछित के रूप में समूह बनते हैं। एक चुनना आसान नहीं है गैर-शून्य value
प्रति grp
बाहरी में SELECT
।
आपके दूसरे मामले . के लिए , मैं मान लूंगा कि पंक्तियों का प्रारंभिक क्रम (id1, id2, tms)
द्वारा निर्धारित किया जाता है जैसा कि आपके एक प्रश्न द्वारा दर्शाया गया है।
SELECT id1, id2, tms
, count(step) OVER (ORDER BY id1, id2, tms) AS group_id
FROM (
SELECT *, CASE WHEN lag(tms, 1, '-infinity') OVER (PARTITION BY id1 ORDER BY id2, tms)
< tms - interval '5 min'
THEN true END AS step
FROM table0
) sub
ORDER BY id1, id2, tms;
अपने वास्तविक आदेश के अनुकूल। इनमें से कोई एक इसे कवर कर सकता है:
PARTITION BY id1 ORDER BY id2 -- ignore tms
PARTITION BY id1 ORDER BY tms -- ignore id2
SQL Fiddle एक विस्तृत उदाहरण के साथ।
संबंधित: