प्रश्न पुराना है, लेकिन यह समाधान अब तक जो पोस्ट किया गया है उससे कहीं अधिक सरल और तेज़ है:
SELECT b.machine_id
, batch
, timestamp_sta
, timestamp_stp
, min(timestamp_sta) OVER w AS batch_start
, max(timestamp_stp) OVER w AS batch_end
FROM db_data.sta_stp a
JOIN db_data.ll_lu b ON a.ll_lu_id = b.id
WINDOW w AS (PARTITION BY batch, b.machine_id) -- No ORDER BY !
ORDER BY timestamp_sta, batch, machine_id; -- why this ORDER BY?
अगर आप ORDER BY
. जोड़ते हैं विंडो फ्रेम परिभाषा के अनुसार, प्रत्येक अगली पंक्ति अधिक ORDER BY
. के साथ अभिव्यक्ति में बाद में फ्रेम शुरू होता है। न तो min()
न ही first_value()
तब पूरे विभाजन के लिए "पहला" टाइमस्टैम्प वापस कर सकता है। बिना ORDER BY
एक ही विभाजन की सभी पंक्तियाँ सहकर्मी . हैं और आपको अपना वांछित परिणाम मिलता है।
आपका जोड़ा गया ORDER BY
काम करता है (विंडो फ्रेम परिभाषा में से एक नहीं, बाहरी एक), लेकिन यह समझ में नहीं आता है और क्वेरी को और अधिक महंगा बनाता है। आपको संभवत:ORDER BY
का उपयोग करना चाहिए क्लॉज जो अतिरिक्त सॉर्ट लागत से बचने के लिए आपकी विंडो फ्रेम परिभाषा से सहमत है:
...
ORDER BY batch, b.machine_id, timestamp_sta, timestamp_stp;
मुझे DISTINCT
. की आवश्यकता नहीं दिखाई दे रही है इस क्वेरी में। यदि आपको वास्तव में इसकी आवश्यकता है तो आप इसे जोड़ सकते हैं। या DISTINCT ON ()
. लेकिन फिर ORDER BY
उपवाक्य और भी प्रासंगिक हो जाता है। देखें:
यदि आपको उसी पंक्ति (टाइमस्टैम्प द्वारा क्रमबद्ध करते समय) से कुछ अन्य कॉलम की आवश्यकता है, तो FIRST_VALUE()
के साथ आपका विचार और LAST_VALUE()
जाने का रास्ता हो सकता है। आपको शायद इसे विंडो फ्रेम परिभाषा में जोड़ना होगा फिर :
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
देखें: