खोज…


सामान्य उदाहरण

डेटा तैयार करना:

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 में मिला था। आदि।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow