यदि आपका मामला उतना ही सरल है जितना कि उदाहरण मान सुझाते हैं, @Giorgos' उत्तर अच्छी तरह से कार्य करता है।
हालांकि, आमतौर पर ऐसा नहीं होता . अगर id
कॉलम एक serial
है , आप इस धारणा पर भरोसा नहीं कर सकते हैं कि एक पंक्ति पहले के time
. के साथ है एक छोटा id
भी है .
इसके अलावा, time
मान (या timestamp
जैसा कि आपके पास शायद है) आसानी से डुप्लीकेट हो सकते हैं, आपको सॉर्ट ऑर्डर को स्पष्ट बनाने की आवश्यकता है।
मान लें कि दोनों हो सकते हैं, और आप id
. चाहते हैं पंक्ति से जल्द से जल्द time
प्रति समय टुकड़ा (वास्तव में, सबसे छोटा id
जल्द से जल्द समय . के लिए , संबंध हो सकते हैं), यह प्रश्न स्थिति से ठीक से निपटेगा:
SELECT *
FROM (
SELECT DISTINCT ON (way, grp)
id, way, time AS time_from
, max(time) OVER (PARTITION BY way, grp) AS time_to
FROM (
SELECT *
, row_number() OVER (ORDER BY time, id) -- id as tie breaker
- row_number() OVER (PARTITION BY way ORDER BY time, id) AS grp
FROM table1
) t
ORDER BY way, grp, time, id
) sub
ORDER BY time_from, id;
-
ORDER BY time, id
असंदिग्ध होना। मान लें कि समय नहीं है अद्वितीय, जोड़ें (अद्वितीय माना जाता है)id
मनमाने परिणामों से बचने के लिए - जो गुप्त तरीकों से प्रश्नों के बीच बदल सकता है। -
max(time) OVER (PARTITION BY way, grp)
:बिनाORDER BY
, विंडो फ्रेम पार्टिशन की सभी पंक्तियों को फैलाता है, इसलिए हमें पूर्ण अधिकतम प्रति बार टुकड़ा मिलता है। -
परिणाम में वांछित सॉर्ट क्रम उत्पन्न करने के लिए बाहरी क्वेरी परत केवल आवश्यक है, क्योंकि हम एक अलग
ORDER BY
के लिए बाध्य हैं सबक्वेरी मेंsub
DISTINCT ON
. का उपयोग करके . विवरण:
SQL Fiddle उपयोग के मामले का प्रदर्शन।
यदि आप प्रदर्शन को अनुकूलित करना चाहते हैं, तो ऐसे मामले में एक plpgsql फ़ंक्शन तेज़ हो सकता है। निकट से संबंधित उत्तर:
इसके अलावा:मूल प्रकार के नाम का उपयोग न करें time
पहचानकर्ता के रूप में (एक मानक SQL में आरक्षित शब्द )।