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

GROUP BY और समग्र अनुक्रमिक संख्यात्मक मान

गैर-लगातार मूल्यों की पहचान करना हमेशा थोड़ा मुश्किल होता है और इसमें कई नेस्टेड उप-प्रश्न शामिल होते हैं (कम से कम मैं एक बेहतर समाधान के साथ नहीं आ सकता)।

पहला कदम वर्ष के लिए गैर-लगातार मूल्यों की पहचान करना है:

चरण 1) गैर-लगातार मानों की पहचान करें

select company, 
       profession,
       year,
       case 
          when row_number() over (partition by company, profession order by year) = 1 or 
               year - lag(year,1,year) over (partition by company, profession order by year) > 1 then 1
          else 0
       end as group_cnt
from qualification

यह निम्नलिखित परिणाम देता है:

 company | profession | year | group_cnt
---------+------------+------+-----------
 Google  | Programmer | 2000 |         1
 Google  | Sales      | 2000 |         1
 Google  | Sales      | 2001 |         0
 Google  | Sales      | 2002 |         0
 Google  | Sales      | 2004 |         1
 Mozilla | Sales      | 2002 |         1

अब group_cnt मान के साथ हम लगातार वर्षों वाले प्रत्येक समूह के लिए "ग्रुप आईडी" बना सकते हैं:

चरण 2) समूह आईडी परिभाषित करें

select company,
   profession,
   year,
   sum(group_cnt) over (order by company, profession, year) as group_nr
from ( 
select company, 
       profession,
       year,
       case 
          when row_number() over (partition by company, profession order by year) = 1 or 
               year - lag(year,1,year) over (partition by company, profession order by year) > 1 then 1
          else 0
       end as group_cnt
from qualification
) t1

यह निम्नलिखित परिणाम देता है:

 company | profession | year | group_nr
---------+------------+------+----------
 Google  | Programmer | 2000 |        1
 Google  | Sales      | 2000 |        2
 Google  | Sales      | 2001 |        2
 Google  | Sales      | 2002 |        2
 Google  | Sales      | 2004 |        3
 Mozilla | Sales      | 2002 |        4
(6 rows)

जैसा कि आप देख सकते हैं कि प्रत्येक "समूह" का अपना group_nr होता है और इसका उपयोग हम अंत में एक और व्युत्पन्न तालिका जोड़कर कुल मिलाकर कर सकते हैं:

चरण 3) अंतिम क्वेरी

select company,
       profession,
       array_agg(year) as years
from (
  select company,
       profession,
       year,
       sum(group_cnt) over (order by company, profession, year) as group_nr
  from ( 
    select company, 
           profession,
           year,
           case 
              when row_number() over (partition by company, profession order by year) = 1 or 
                   year - lag(year,1,year) over (partition by company, profession order by year) > 1 then 1
              else 0
           end as group_cnt
    from qualification
  ) t1
) t2
group by company, profession, group_nr
order by company, profession, group_nr

यह निम्नलिखित परिणाम देता है:

 company | profession |      years
---------+------------+------------------
 Google  | Programmer | {2000}
 Google  | Sales      | {2000,2001,2002}
 Google  | Sales      | {2004}
 Mozilla | Sales      | {2002}
(4 rows)

अगर मैं गलत नहीं हूँ, तो ठीक यही आप चाहते थे।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. प्रति दिन 1 से अधिक रिकॉर्ड कैसे चुनें?

  2. PostgreSQL:FATAL - उपयोगकर्ता के लिए पीयर प्रमाणीकरण विफल (PG::ConnectionBad)

  3. पोस्टग्रेज में मूल्य के प्रकार की जांच कैसे करें

  4. Linux/Windows में PgBouncer लॉग्स को रोटेट कैसे करें?

  5. PosgreSQL txid_current () मान की व्याख्या कैसे करें