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

SQL क्वेरी एकाधिक रैंक/समूह से पहली रैंक 1 पंक्ति का चयन करें

आप अपने विश्लेषणात्मक कार्य में ऑर्डर करने के लिए कई शर्तें निर्दिष्ट कर सकते हैं

SELECT *
  FROM (SELECT id,
               col1,
               col2,
               col3,
               dense_rank() over (partition by id
                                      order by (case when col1 = 'xyz' 
                                                     then 1 
                                                     else 0 
                                                 end) desc,
                                               col2 asc,
                                               col3 asc) rnk
          FROM your_table)
 WHERE rnk = 1

मैं मान रहा हूँ कि आप dense_rank want चाहते हैं यह देखते हुए कि आपने dense_rank . का उपयोग किया है उपनाम। आप इस बारे में बात नहीं करते हैं कि आप संबंधों को कैसे संभालना चाहते हैं या क्या संबंध संभव हैं, इसलिए यह प्रश्न से ही स्पष्ट नहीं है कि आप rank का उपयोग करना चाहते हैं या नहीं , dense_rank , या row_number विश्लेषणात्मक कार्य। यदि आप केवल उच्चतम रैंकिंग पंक्ति प्रति id . प्राप्त कर रहे हैं , rank और dense_rank समान व्यवहार करेगा और पहले स्थान के लिए संबंध होने पर कई पंक्तियों को वापस कर देगा। row_number मनमाने ढंग से टाई तोड़कर हमेशा एक पंक्ति लौटाएगा। यदि आप प्रति id . के लिए पहली पंक्ति के अलावा अन्य पंक्तियाँ लाना चाहते हैं , तो आपको संबंधों के बारे में सोचना होगा और आपको rank . से अलग व्यवहार मिलेगा और dense_rank . अगर पहली पंक्ति के लिए दो पंक्तियाँ बंधी हैं, dense_rank तीसरी पंक्ति को एक rnk असाइन करेगा 2 का, जबकि rank इसे एक rnk असाइन करेगा 3.

ऐसा लगता है कि यह आपके द्वारा पोस्ट किए गए नमूना डेटा के लिए काम करता है

SQL> ed
Wrote file afiedt.buf

  1  with x as (
  2  select 1 id, 'abc' col1, to_date('01/01/2012', 'MM/DD/YYYY') col2, null col3 from dual union all
  3  select 1 id, 'abc' col1, to_date('01/01/2012', 'MM/DD/YYYY') col2, 'A' col3 from dual union all
  4  select 2 id, 'abc' col1, to_date('01/01/2012', 'MM/DD/YYYY') col2, null col3 from dual union all
  5  select 2 id, 'abc' col1, to_date('01/02/2012', 'MM/DD/YYYY') col2, null col3 from dual union all
  6  select 3 id, 'abc' col1, to_date('01/02/2012', 'MM/DD/YYYY') col2, null col3 from dual union all
  7  select 3 id, 'xyz' col1, to_date('01/01/2012', 'MM/DD/YYYY') col2, null col3 from dual union all
  8  select 4 id, 'abc' col1, to_date('01/02/2012', 'MM/DD/YYYY') col2, null col3 from dual union all
  9  select 4 id, 'xyz' col1, to_date('01/01/2012', 'MM/DD/YYYY') col2, null col3 from dual union all
 10  select 4 id, 'xyz' col1, to_date('01/02/2012', 'MM/DD/YYYY') col2, null col3 from dual
 11  )
 12  SELECT *
 13    FROM (SELECT id,
 14                 col1,
 15                 col2,
 16                 col3,
 17                 dense_rank() over (partition by id
 18                                        order by (case when col1 = 'xyz'
 19                                                       then 1
 20                                                       else 0
 21                                                   end) desc,
 22                                                 col2 asc,
 23                                                 col3 asc) rnk
 24            FROM x)
 25*  WHERE rnk = 1
SQL> /

        ID COL COL2      C        RNK
---------- --- --------- - ----------
         1 abc 01-JAN-12 A          1
         2 abc 01-JAN-12            1
         3 xyz 01-JAN-12            1
         4 xyz 01-JAN-12            1


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. पुनरावर्ती SQL और विभिन्न स्तरों पर जानकारी

  2. Oracle.DataAccess त्रुटि

  3. Oracle SQL डेवलपर के साथ पासवर्ड बदलना

  4. DATE का उपयोग करने वाली बाधाएं

  5. ओरेकल में 'सिंगल कोट' का अनुमान और बचाव कैसे करें?