गैर-लगातार मूल्यों की पहचान करना हमेशा थोड़ा मुश्किल होता है और इसमें कई नेस्टेड उप-प्रश्न शामिल होते हैं (कम से कम मैं एक बेहतर समाधान के साथ नहीं आ सकता)।
पहला कदम वर्ष के लिए गैर-लगातार मूल्यों की पहचान करना है:
चरण 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)
अगर मैं गलत नहीं हूँ, तो ठीक यही आप चाहते थे।