आपकी परिभाषा:
<ब्लॉककोट>समूह बी की गतिविधि हमेशा समूह ए की गतिविधि के बाद होती है।
.. तार्किक रूप से तात्पर्य है कि प्रति उपयोगकर्ता, 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
. के साथ क्लॉज खिड़की के कार्यों का खंड। हालांकि :
-
FILTER
खंड केवल वर्तमान पंक्ति के मानों के साथ ही काम कर सकता है। -
इससे भी महत्वपूर्ण बात,
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 को अनुकूलित करें