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

विशिष्ट स्थिति और उचित लीड () उपयोग पर SQL अंतर कूदें

विंडो फ़ंक्शन के साथ क्वेरी

SELECT *
FROM  (
   SELECT *
         ,lag(val, 1, 0)    OVER (PARTITION BY status ORDER BY id) AS last_val
         ,lag(status, 1, 0) OVER w2 AS last_status
         ,lag(next_id)      OVER w2 AS next_id_of_last_status
   FROM  (
      SELECT *, lead(id) OVER (PARTITION BY status ORDER BY id) AS next_id
      FROM   t1
      ) AS t
   WINDOW w2 AS (PARTITION BY val ORDER BY id)
  ) x
WHERE (last_val <> val OR last_status <> status)
AND   (status = 1 
       OR last_status = 1
          AND ((next_id_of_last_status > id) OR next_id_of_last_status IS NULL)
      )
ORDER  BY id

जो हमारे पास पहले से था के अलावा , हमें मान्य ऑफ स्विच की आवश्यकता है।

एक OFF अगर डिवाइस को स्विच किया गया था तो स्विच करें ON पहले (last_status = 1 ) और अगला ON उसके बाद का ऑपरेशन OFF . के बाद आता है विचाराधीन स्विच (next_id_of_last_status > id )।

हमें उस विशेष मामले के लिए प्रदान करना होगा जो अंतिम था ON ऑपरेशन, इसलिए हम NULL . की जांच करते हैं इसके अलावा (OR next_id_of_last_status IS NULL )।

next_id_of_last_status उसी विंडो से आता है जिसे हम लेते हैं last_status से। इसलिए मैंने स्पष्ट विंडो घोषणा के लिए अतिरिक्त सिंटैक्स पेश किया, इसलिए मुझे खुद को दोहराने की जरूरत नहीं है:

WINDOW w2 AS (PARTITION BY val ORDER BY id)

और हमें पहले एक सबक्वेरी में अंतिम स्थिति के लिए अगली आईडी प्राप्त करने की आवश्यकता है (सबक्वेरी t )।

अगर आप सब समझ गए हैं वह , आपको थप्पड़ मारने में कोई समस्या नहीं होनी चाहिए lead() इस क्वेरी के शीर्ष पर अपने अंतिम गंतव्य तक पहुंचने के लिए। :)

PL/pgSQL फ़ंक्शन

एक बार जब यह जटिल हो जाता है, तो प्रक्रियात्मक प्रसंस्करण पर स्विच करने का समय आ जाता है।

यह तुलनात्मक रूप से सरल plpgsql फ़ंक्शन जटिल विंडो फ़ंक्शन क्वेरी के प्रदर्शन को न्यूक करता है, साधारण कारण से कि उसे केवल एक बार पूरी तालिका को स्कैन करना पड़ता है।

CREATE OR REPLACE FUNCTION valid_t1 (OUT t t1)  -- row variable of table type
  RETURNS SETOF t1 LANGUAGE plpgsql AS
$func$
DECLARE
   _last_on int := -1;  -- init with impossible value
BEGIN

FOR t IN
   SELECT * FROM t1 ORDER BY id
LOOP
   IF t.status = 1 THEN
      IF _last_on <> t.val THEN
         RETURN NEXT;
         _last_on := t.val;
      END IF;
   ELSE
      IF _last_on = t.val THEN
         RETURN NEXT;
         _last_on := -1;
      END IF;
   END IF;
END LOOP;

END
$func$;

कॉल करें:

SELECT * FROM valid_t1();



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. नाइटवॉच कस्टम कमांड कॉलबैक

  2. क्या PostgreSQL के लिए psycopg2 या sqlalchemy से VACUUM ANALYZE <tablename> जारी करना संभव है?

  3. JOOQ का उपयोग करके PostgreSQL में JSON कॉलम के साथ एक अद्यतन करने योग्य रिकॉर्ड कैसे सम्मिलित करें?

  4. पोस्टग्रेस्क्ल में सिद्धांत JSON कॉलम एक ही डेटा की वस्तुओं या सरणियों को संग्रहीत कर रहा है

  5. पोस्टग्रेज में Seq स्कैन और बिटमैप हीप स्कैन में क्या अंतर है?