postgresql
विंडो फ़ंक्शंस
खोज…
सामान्य उदाहरण
डेटा तैयार करना:
create table wf_example(i int, t text,ts timestamptz,b boolean);
insert into wf_example select 1,'a','1970.01.01',true;
insert into wf_example select 1,'a','1970.01.01',false;
insert into wf_example select 1,'b','1970.01.01',false;
insert into wf_example select 2,'b','1970.01.01',false;
insert into wf_example select 3,'b','1970.01.01',false;
insert into wf_example select 4,'b','1970.02.01',false;
insert into wf_example select 5,'b','1970.03.01',false;
insert into wf_example select 2,'c','1970.03.01',true;
चल रहा है:
select *
, dense_rank() over (order by i) dist_by_i
, lag(t) over () prev_t
, nth_value(i, 6) over () nth
, count(true) over (partition by i) num_by_i
, count(true) over () num_all
, ntile(3) over() ntile
from wf_example
;
परिणाम:
i | t | ts | b | dist_by_i | prev_t | nth | num_by_i | num_all | ntile
---+---+------------------------+---+-----------+--------+-----+----------+---------+-------
1 | a | 1970-01-01 00:00:00+01 | f | 1 | | 3 | 3 | 8 | 1
1 | a | 1970-01-01 00:00:00+01 | t | 1 | a | 3 | 3 | 8 | 1
1 | b | 1970-01-01 00:00:00+01 | f | 1 | a | 3 | 3 | 8 | 1
2 | c | 1970-03-01 00:00:00+01 | t | 2 | b | 3 | 2 | 8 | 2
2 | b | 1970-01-01 00:00:00+01 | f | 2 | c | 3 | 2 | 8 | 2
3 | b | 1970-01-01 00:00:00+01 | f | 3 | b | 3 | 1 | 8 | 2
4 | b | 1970-02-01 00:00:00+01 | f | 4 | b | 3 | 1 | 8 | 3
5 | b | 1970-03-01 00:00:00+01 | f | 5 | b | 3 | 1 | 8 | 3
(8 rows)
स्पष्टीकरण:
dist_by_i : dense_rank() over (order by i)
अलग-अलग मानों के अनुसार row_number की तरह है। I के विभिन्न मूल्यों की संख्या के लिए इस्तेमाल किया जा सकता है ( count(DISTINCT i)
wold not work)। बस अधिकतम मूल्य का उपयोग करें।
prev_t : lag(t) over ()
पूरी विंडो पर t का पिछला मान है। मन कि यह पहली पंक्ति के लिए अशक्त है।
nth : nth_value(i, 6) over ()
पूरे विंडो पर छठी पंक्तियों के कॉलम i का मान है
num_by_i : count(true) over (partition by i)
के प्रत्येक मान के लिए पंक्तियों की एक राशि है
num_all : count(true) over ()
पूरी विंडो में पंक्तियों की एक मात्रा है
ntile : ntile(3) over()
पूरी विंडो को 3 में विभाजित करता है (जितना संभव हो) मात्रा भागों में बराबर
कॉलम मान बनाम dense_rank बनाम रैंक बनाम row_number
यहां आप फ़ंक्शन पा सकते हैं।
पिछले उदाहरण में बनाई गई wf_example तालिका के साथ, चलाएँ:
select i
, dense_rank() over (order by i)
, row_number() over ()
, rank() over (order by i)
from wf_example
परिणाम है:
i | dense_rank | row_number | rank
---+------------+------------+------
1 | 1 | 1 | 1
1 | 1 | 2 | 1
1 | 1 | 3 | 1
2 | 2 | 4 | 4
2 | 2 | 5 | 4
3 | 3 | 6 | 6
4 | 4 | 7 | 7
5 | 5 | 8 | 8
dense_rank आदेश विंडो में उपस्थिति से मैं के मूल्यों।
i=1
प्रकट होता है, इसलिए पहली पंक्ति में dense_rank है, अगला और तीसरा i मान नहीं बदलता है, इसलिए यहdense_rank
1 दिखाता है - FIRST मान परिवर्तित नहीं हुआ है। चौथी पंक्तिi=2
, यह आईdense_rank
का दूसरा मूल्य है, इसलिएdense_rank
अगली पंक्ति के लिए 2, andso दिखाता है। तो फिर यह मूल्य मिलता हैi=3
6 पंक्ति में है, इसलिए इसे 3. मैं के बाकी दो मानों के लिए एक ही दिखाते हैं। तोdense_rank
का अंतिम मान i के विभिन्न मूल्यों की संख्या है।row_number ऑर्डर ROWS के रूप में वे सूचीबद्ध हैं।
रैंक
dense_rank
साथ भ्रमित करने के लिए नहीं, यह फ़ंक्शन i मानों की संख्या का आदेश देता है। तो यह तीन लोगों के साथ शुरू होता है, लेकिन अगला मान 4 है, जिसका अर्थ हैi=2
(नया मूल्य) पंक्ति 4 में मिला था। वहीi=3
पंक्ति 6 में मिला था। आदि।