खोज…
हर पंक्ति में चयनित कुल पंक्तियों को जोड़ना
SELECT your_columns, COUNT(*) OVER() as Ttl_Rows FROM your_data_set
आईडी | नाम | Ttl_Rows |
---|---|---|
1 | उदाहरण | 5 |
2 | foo | 5 |
3 | बार | 5 |
4 | baz | 5 |
5 | quux | 5 |
गणना करने के लिए दो प्रश्नों का उपयोग करने के बजाय फिर लाइन, आप एक समुच्चय का उपयोग विंडो फ़ंक्शन के रूप में कर सकते हैं और विंडो के रूप में सेट किए गए पूर्ण परिणाम का उपयोग कर सकते हैं।
इसे अतिरिक्त सेल्फ जॉइन की जटिलता के बिना आगे की गणना के लिए एक आधार के रूप में इस्तेमाल किया जा सकता है।
अन्य पंक्तियों में एक समान गुण होने पर ध्वज स्थापित करना
मान लें कि मेरे पास यह डेटा है:
टेबल आइटम
आईडी | नाम | टैग |
---|---|---|
1 | उदाहरण | unique_tag |
2 | foo | सरल |
42 | बार | सरल |
3 | baz | नमस्कार |
51 | quux | विश्व |
मैं उन सभी लाइनों को प्राप्त करना चाहता हूं और यह जानना चाहता हूं कि क्या टैग अन्य लाइनों द्वारा उपयोग किया जाता है
SELECT id, name, tag, COUNT(*) OVER (PARTITION BY tag) > 1 AS flag FROM items
परिणाम होगा:
आईडी | नाम | टैग | झंडा |
---|---|---|---|
1 | उदाहरण | unique_tag | असत्य |
2 | foo | सरल | सच |
42 | बार | सरल | सच |
3 | baz | नमस्कार | असत्य |
51 | quux | विश्व | असत्य |
यदि आपके डेटाबेस में OVER और PARTITION नहीं है, तो आप इसका उपयोग उसी परिणाम के लिए कर सकते हैं:
SELECT id, name, tag, (SELECT COUNT(tag) FROM items B WHERE tag = A.tag) > 1 AS flag FROM items A
एक कुल चल रहा है
इस डेटा को देखते हुए:
दिनांक | रकम |
---|---|
2016/03/12 | 200 |
2016/03/11 | -50 |
2016/03/14 | 100 |
2016/03/15 | 100 |
2016/03/10 | -250 |
SELECT date, amount, SUM(amount) OVER (ORDER BY date ASC) AS running
FROM operations
ORDER BY date ASC
तुम्हे दूंगा
दिनांक | रकम | चल रहा है |
---|---|---|
2016/03/10 | -250 | -250 |
2016/03/11 | -50 | -300 |
2016/03/12 | 200 | -100 |
2016/03/14 | 100 | 0 |
2016/03/15 | 100 | -100 |
कई समूहीकरण पर एन सबसे हाल की पंक्तियाँ प्राप्त करना
इस डेटा को देखते हुए
यूज़र आईडी | पूरा करने की तिथि |
---|---|
1 | 2016/07/20 |
1 | 2016/07/21 |
2 | 2016/07/20 |
2 | 2016/07/21 |
2 | 2016/07/22 |
;with CTE as
(SELECT *,
ROW_NUMBER() OVER (PARTITION BY User_ID
ORDER BY Completion_Date DESC) Row_Num
FROM Data)
SELECT * FORM CTE WHERE Row_Num <= n
का उपयोग करते हुए n = 1, आप प्रति एक सबसे हाल ही में पंक्ति मिलेगा user_id
:
यूज़र आईडी | पूरा करने की तिथि | ROW_NUM |
---|---|---|
1 | 2016/07/21 | 1 |
2 | 2016/07/22 | 1 |
LAG () फ़ंक्शन का उपयोग करके "आउट-ऑफ-सीक्वेंस" रिकॉर्ड खोजना
इन नमूना आंकड़ों को देखते हुए:
आईडी | स्थिति | STATUS_TIME | STATUS_BY |
---|---|---|---|
1 | एक | 2016-09-28-19.47.52.501398 | USER_1 |
3 | एक | 2016-09-28-19.47.52.501511 | USER_2 |
1 | तीन | 2016-09-28-19.47.52.501517 | USER_3 |
3 | दो | 2016-09-28-19.47.52.501521 | USER_2 |
3 | तीन | 2016-09-28-19.47.52.501524 | USER_4 |
ID
मानों द्वारा पहचानी गई वस्तुओं को STATUS
'ONE' से 'TWO' क्रम में 'THREE' क्रम में ले जाना चाहिए, बिना स्केच की स्थिति के। समस्या उपयोगकर्ताओं ( STATUS_BY
) मानों को खोजने की है जो नियम का उल्लंघन करते हैं और 'ONE' से तुरंत 'THREE' में चले जाते हैं।
LAG()
विश्लेषणात्मक फ़ंक्शन प्रत्येक पंक्ति के लिए पूर्ववर्ती पंक्ति में मान देकर समस्या को हल करने में मदद करता है:
SELECT * FROM (
SELECT
t.*,
LAG(status) OVER (PARTITION BY id ORDER BY status_time) AS prev_status
FROM test t
) t1 WHERE status = 'THREE' AND prev_status != 'TWO'
यदि आपके डेटाबेस में LAG () नहीं है, तो आप इसका उपयोग उसी परिणाम के लिए कर सकते हैं:
SELECT A.id, A.status, B.status as prev_status, A.status_time, B.status_time as prev_status_time
FROM Data A, Data B
WHERE A.id = B.id
AND B.status_time = (SELECT MAX(status_time) FROM Data where status_time < A.status_time and id = A.id)
AND A.status = 'THREE' AND NOT B.status = 'TWO'