PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

PostgreSQL में एक पंक्ति में विंडो फ़ंक्शन का पहला और अंतिम मान

प्रश्न पुराना है, लेकिन यह समाधान अब तक जो पोस्ट किया गया है उससे कहीं अधिक सरल और तेज़ है:

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

देखें:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgresql में कॉलम से हटाए गए मेरे डेटाबेस सीरियल को पुनर्स्थापित करने के बाद

  2. PostgreSQL में औसतन 2 दशमलव स्थानों को कैसे गोल करें?

  3. WHERE क्लॉज में दो बार एक ही सूची का उपयोग कैसे करें?

  4. पंक्ति की संख्या एक सीमा के अंतर्गत होने पर ही पंक्ति सम्मिलित करें को पोस्टग्रेज़ करें

  5. मुझे CSV आयात करते समय postgresql में टाइप पूर्णांक के लिए अमान्य इनपुट सिंटैक्स क्यों मिल रहा है?