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

मैं रिकॉर्ड को चुनिंदा रूप से बहिष्कृत करने के लिए Redshift/Postgresql LAG विंडो फ़ंक्शन कैसे प्राप्त कर सकता हूं?

मेरे दिमाग में जो तरीका आया वह यह था कि इसके बजाय अलग-अलग रिकॉर्ड को लक्षित किया जाए, जिन्हें TRUE के रूप में लेबल किया जाना चाहिए। . इस पर विचार करें:

WITH cte AS (
    SELECT *,
        ROW_NUMBER() OVER (PARTITION BY phone ORDER BY ts) rn
    FROM notifications n1
    WHERE EXISTS (SELECT 1 FROM notifications n2 WHERE n1.phone = n2.phone AND
                  n2.ts < n1.ts AND n2.status = 'SUB' AND n2.result = 'SUCCESS') AND
          n1.status = 'RENEWAL' AND n1.result = 'SUCCESS'
)

SELECT n1.*,
    CASE WHEN n2.rn = 1 THEN 'TRUE'
         WHEN n2.rn > 1 THEN 'FALSE' END AS is_first_renewal
FROM notifications n1
LEFT JOIN cte n2
    ON n1.phone = n2.phone AND n1.ts = n2.ts;

ऐसा लगता है कि यह क्वेरी नीचे दिए गए पोस्टग्रेज़ डेमो लिंक में काम कर रही है।

डेमो




  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. एक ट्रिगर फ़ंक्शन में निष्पादित करने के लिए पुराने, नए और पहचानकर्ताओं को कैसे पास करें?

  3. मैं एक विदेशी कुंजी तालिका को दो बार कैसे संदर्भित करूं?

  4. वापसी प्रकार SETOF तालिका और अतिरिक्त फ़ील्ड होने का आसान तरीका?

  5. Postgresql में सरणी सम्मिलित करना