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

सशर्त लीड/अंतराल समारोह PostgreSQL?

आपकी परिभाषा:

<ब्लॉककोट>

समूह बी की गतिविधि हमेशा समूह ए की गतिविधि के बाद होती है।

.. तार्किक रूप से तात्पर्य है कि प्रति उपयोगकर्ता, 0 या 1 बी गतिविधि 1 या अधिक ए गतिविधियों के बाद होती है। क्रम में 1 से अधिक बी गतिविधियां कभी नहीं।

आप इसे सिंगल विंडो फ़ंक्शन के साथ काम कर सकते हैं, DISTINCT ON और CASE , जो कुछ . के लिए सबसे तेज़ तरीका होना चाहिए प्रति उपयोगकर्ता पंक्तियाँ (नीचे भी देखें):

SELECT name
     , CASE WHEN a2 LIKE 'B%' THEN a1 ELSE a2 END AS activity
     , CASE WHEN a2 LIKE 'B%' THEN a2 END AS next_activity
FROM  (
   SELECT DISTINCT ON (name)
          name
        , lead(activity) OVER (PARTITION BY name ORDER BY time DESC) AS a1
        , activity AS a2
   FROM   t
   WHERE (activity LIKE 'A%' OR activity LIKE 'B%')
   ORDER  BY name, time DESC
   ) sub;

db<>यहां बेला करें

एक एसक्यूएल CASE अभिव्यक्ति डिफ़ॉल्ट रूप से NULL . है अगर नहीं ELSE शाखा जोड़ दी गई है, इसलिए मैंने उसे छोटा रखा।

मान लें कि time परिभाषित किया गया है NOT NULL . अन्यथा, आप NULLS LAST add जोड़ना चाह सकते हैं . क्यों?

  • कॉलम ASC के अनुसार क्रमित करें, लेकिन NULL मान पहले?

(activity LIKE 'A%' OR activity LIKE 'B%') activity ~ '^[AB]' . से अधिक क्रियात्मक है , लेकिन आमतौर पर पोस्टग्रेज़ के पुराने संस्करणों में तेज़ होता है। पैटर्न मिलान के बारे में:

  • PostgreSQL में LIKE, SIMILAR TO या रेगुलर एक्सप्रेशन से मिलान करने वाला पैटर्न

सशर्त विंडो फ़ंक्शन?

यह वास्तव में संभव है . आप कुल FILTER . को जोड़ सकते हैं OVER . के साथ क्लॉज खिड़की के कार्यों का खंड। हालांकि :

  1. FILTER खंड केवल वर्तमान पंक्ति के मानों के साथ ही काम कर सकता है।

  2. इससे भी महत्वपूर्ण बात, FILTER lead() . जैसे शुद्ध वास्तविक कार्यों के लिए लागू नहीं किया गया है या lag() (पोस्टग्रेज 13 तक) - केवल समग्र कार्यों के लिए।

अगर आप कोशिश करते हैं:

lead(activity) FILTER (WHERE activity LIKE 'A%') OVER () AS activity

पोस्टग्रेज आपको बताएंगे:

FILTER is not implemented for non-aggregate window functions

FILTER के बारे में :

  • अतिरिक्त (विशिष्ट) फ़िल्टर वाले कुल कॉलम
  • विंडो फ़ंक्शन के फ़िल्टर क्लॉज़ में वर्तमान पंक्ति को संदर्भित करना

प्रदर्शन

कुछ के लिए कुछ . वाले उपयोगकर्ता प्रति उपयोगकर्ता पंक्तियाँ, लगभग कोई भी अनुक्रमणिका के बिना भी क्वेरी तेज़ है।

कई . के लिए उपयोगकर्ता और कुछ प्रति उपयोगकर्ता पंक्तियाँ, ऊपर की पहली क्वेरी सबसे तेज़ होनी चाहिए। देखें:

  • समूह द्वारा प्रत्येक समूह में पहली पंक्ति का चयन करें?

कई . के लिए प्रति उपयोगकर्ता पंक्तियाँ हैं (संभावित रूप से बहुत ) आपके सेटअप के विवरण के आधार पर तेज़ तकनीकें। देखें:

  • प्रति उपयोगकर्ता नवीनतम पंक्ति पुनर्प्राप्त करने के लिए क्वेरी द्वारा GROUP को अनुकूलित करें


  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 कॉलम foo मौजूद नहीं है जहां foo मान है

  2. Linux पर PostgreSQL डेटाबेस डिफ़ॉल्ट स्थान

  3. PostgreSQL में फ्रीजिंग का प्रबंधन

  4. PostgreSQL में दशमलव बिंदु के बाद गैर-शून्य रिकॉर्ड प्राप्त करें

  5. तार्किक प्रतिकृति समाधानों की प्रदर्शन सीमाएँ