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

Oracle SQL - अनुक्रमिक मान श्रेणियों की पहचान करें

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle डेटाबेस में डेटाटाइम मान से मिनट प्राप्त करने के 2 तरीके

  2. खराब स्टैंडबाय

  3. एक अलग टेबलस्पेस (ओरेकल एसक्यूएल) का उपयोग कर एक क्वेरी से एक टेबल बनाना

  4. JDBC पतले ड्राइवर के लिए NLS_LANG सेटिंग?

  5. उदाहरण के साथ Oracle में प्राथमिक कुंजी पर शीर्ष प्रश्न