Tabibitosan नामक तकनीक से ऐसा करना आसान है।
यह तकनीक प्रत्येक समूह की पंक्तियों की स्थिति की तुलना पंक्तियों के समग्र सेट से करती है, ताकि यह पता लगाया जा सके कि एक ही समूह में पंक्तियाँ एक-दूसरे के बगल में हैं या नहीं।
उदा., आपके उदाहरण डेटा के साथ, ऐसा दिखता है:
WITH your_table AS (SELECT 1 ID, 'Michael' NAME, 'Marketing' department FROM dual UNION ALL
SELECT 2 ID, 'Alex' NAME, 'Marketing' department FROM dual UNION ALL
SELECT 3 ID, 'Tom' NAME, 'Marketing' department FROM dual UNION ALL
SELECT 4 ID, 'John' NAME, 'Sales' department FROM dual UNION ALL
SELECT 5 ID, 'Brad' NAME, 'Marketing' department FROM dual UNION ALL
SELECT 6 ID, 'Leo' NAME, 'Marketing' department FROM dual UNION ALL
SELECT 7 ID, 'Kevin' NAME, 'Production' department FROM dual)
-- end of mimicking your table with data in it. See the SQL below:
SELECT ID,
NAME,
department,
row_number() OVER (ORDER BY ID) overall_rn,
row_number() OVER (PARTITION BY department ORDER BY ID) department_rn,
row_number() OVER (ORDER BY ID) - row_number() OVER (PARTITION BY department ORDER BY ID) grp
FROM your_table;
ID NAME DEPARTMENT OVERALL_RN DEPARTMENT_RN GRP
---------- ------- ---------- ---------- ------------- ----------
1 Michael Marketing 1 1 0
2 Alex Marketing 2 2 0
3 Tom Marketing 3 3 0
4 John Sales 4 1 3
5 Brad Marketing 5 4 1
6 Leo Marketing 6 5 1
7 Kevin Production 7 1 6
यहां, मैंने डेटा के पूरे सेट में सभी पंक्तियों को आरोही आईडी क्रम में एक पंक्ति संख्या दी है (overall_rn
कॉलम), और मैंने प्रत्येक विभाग में पंक्तियों को एक पंक्ति संख्या दी है (department_rn
कॉलम), फिर से आरोही आईडी क्रम में।
अब जब मैंने वह कर लिया है, तो हम एक को दूसरे से घटा सकते हैं (grp
कॉलम)।
ध्यान दें कि कैसे एक दूसरे के बगल में स्थित डिपारमेंट पंक्तियों के लिए जीआरपी कॉलम में संख्या समान रहती है, लेकिन हर बार अंतराल होने पर यह बदल जाता है।
उदा. विपणन विभाग के लिए, पंक्तियाँ 1-3 एक-दूसरे के बगल में हैं और उनका जीआरपी =0 है, लेकिन चौथी मार्केटिंग पंक्ति वास्तव में समग्र परिणाम सेट की 5 वीं पंक्ति पर है, इसलिए अब इसकी एक अलग जीआरपी संख्या है। चूंकि 5वीं मार्केटिंग पंक्ति समग्र सेट की 6वीं पंक्ति पर है, इसलिए इसकी जीआरपी संख्या चौथी मार्केटिंग पंक्ति के समान है, इसलिए हम जानते हैं कि वे एक-दूसरे के बगल में हैं।
एक बार हमारे पास वह जीआरपी जानकारी हो जाने के बाद, प्रारंभ और समाप्ति आईडी खोजने के लिए न्यूनतम और अधिकतम का उपयोग करके विभाग और हमारे नए जीआरपी कॉलम दोनों पर एक समग्र क्वेरी समूह बनाना एक साधारण मामला है:
WITH your_table AS (SELECT 1 ID, 'Michael' NAME, 'Marketing' department FROM dual UNION ALL
SELECT 2 ID, 'Alex' NAME, 'Marketing' department FROM dual UNION ALL
SELECT 3 ID, 'Tom' NAME, 'Marketing' department FROM dual UNION ALL
SELECT 4 ID, 'John' NAME, 'Sales' department FROM dual UNION ALL
SELECT 5 ID, 'Brad' NAME, 'Marketing' department FROM dual UNION ALL
SELECT 6 ID, 'Leo' NAME, 'Marketing' department FROM dual UNION ALL
SELECT 7 ID, 'Kevin' NAME, 'Production' department FROM dual)
-- end of mimicking your table with data in it. See the SQL below:
SELECT department,
MIN(ID) start_id,
MAX(ID) end_id
FROM (SELECT ID,
NAME,
department,
row_number() OVER (ORDER BY ID) - row_number() OVER (PARTITION BY department ORDER BY ID) grp
FROM your_table)
GROUP BY department, grp;
DEPARTMENT START_ID END_ID
---------- ---------- ----------
Marketing 1 3
Marketing 5 6
Sales 4 4
Production 7 7
एनबी, मैंने माना है कि आईडी कॉलम में अंतराल महत्वपूर्ण नहीं हैं (यानी यदि आईडी =6 के लिए कोई पंक्ति नहीं थी (इसलिए लियो और केविन की आईडी क्रमशः 7 और 8 थीं), तो लियो और ब्रैड अभी भी उसी में दिखाई देंगे समूह, एक प्रारंभ आईडी =5 और अंत आईडी =7. के साथ।
यदि आईडी कॉलम में अंतराल एक नए समूह को इंगित करने के रूप में गिना जाता है, तो आप पंक्तियों के समग्र सेट को लेबल करने के लिए आईडी का उपयोग कर सकते हैं (यानी समग्र_आरएन को कैलक्यूलेट करने की आवश्यकता नहीं है; इसके बजाय केवल आईडी कॉलम का उपयोग करें)।
इसका मतलब है कि आपकी क्वेरी बन जाएगी:
WITH your_table AS (SELECT 1 ID, 'Michael' NAME, 'Marketing' department FROM dual UNION ALL
SELECT 2 ID, 'Alex' NAME, 'Marketing' department FROM dual UNION ALL
SELECT 3 ID, 'Tom' NAME, 'Marketing' department FROM dual UNION ALL
SELECT 4 ID, 'John' NAME, 'Sales' department FROM dual UNION ALL
SELECT 5 ID, 'Brad' NAME, 'Marketing' department FROM dual UNION ALL
SELECT 7 ID, 'Leo' NAME, 'Marketing' department FROM dual UNION ALL
SELECT 8 ID, 'Kevin' NAME, 'Production' department FROM dual)
-- end of mimicking your table with data in it. See the SQL below:
SELECT department,
MIN(ID) start_id,
MAX(ID) end_id
FROM (SELECT ID,
NAME,
department,
ID - row_number() OVER (PARTITION BY department ORDER BY ID) grp
FROM your_table)
GROUP BY department, grp;
DEPARTMENT START_ID END_ID
---------- ---------- ----------
Marketing 1 3
Sales 4 4
Marketing 5 5
Marketing 7 7
Production 8 8