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

एसक्यूएल रैंक () बनाम ROW_NUMBER ()

आपको अंतर केवल तभी दिखाई देगा जब आपके पास किसी विशेष ऑर्डरिंग मान के लिए विभाजन के भीतर संबंध हों।

RANK और DENSE_RANK इस मामले में नियतात्मक हैं, क्रम और विभाजन दोनों स्तंभों के लिए समान मान वाली सभी पंक्तियाँ एक समान परिणाम के साथ समाप्त होंगी, जबकि ROW_NUMBER मनमाने ढंग से (गैर नियतात्मक रूप से) बंधी हुई पंक्तियों को एक वृद्धिशील परिणाम प्रदान करेगा।

उदाहरण: (सभी पंक्तियों में समान StyleID है तो एक ही विभाजन में हैं और उस विभाजन के भीतर ID . द्वारा आदेश दिए जाने पर पहली 3 पंक्तियाँ बंधी हुई हैं )

WITH T(StyleID, ID)
     AS (SELECT 1,1 UNION ALL
         SELECT 1,1 UNION ALL
         SELECT 1,1 UNION ALL
         SELECT 1,2)
SELECT *,
       RANK() OVER(PARTITION BY StyleID ORDER BY ID)       AS 'RANK',
       ROW_NUMBER() OVER(PARTITION BY StyleID ORDER BY ID) AS 'ROW_NUMBER',
       DENSE_RANK() OVER(PARTITION BY StyleID ORDER BY ID) AS 'DENSE_RANK'
FROM   T  

रिटर्न

StyleID     ID       RANK      ROW_NUMBER      DENSE_RANK
----------- -------- --------- --------------- ----------
1           1        1         1               1
1           1        1         2               1
1           1        1         3               1
1           2        4         4               2

आप देख सकते हैं कि तीन समान पंक्तियों के लिए ROW_NUMBER वेतन वृद्धि, RANK मान वही रहता है तो यह 4 . तक पहुंच जाता है . DENSE_RANK तीनों पंक्तियों को समान रैंक भी प्रदान करता है लेकिन फिर अगले विशिष्ट मान को 2 का मान दिया जाता है।



  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 सर्वर में JSON

  2. क्या एक ही SQL कथन में एकाधिक तालिकाओं से हटाना संभव है?

  3. SQL सर्वर 2005 में किसी तालिका में एकाधिक कॉलम का योग कैसे प्राप्त करें?

  4. मेरा VARCHAR(MAX) फ़ील्ड स्वयं को 4000 पर सीमित कर रहा है; क्या दिया?

  5. SQL सर्वर में किसी स्ट्रिंग की सभी घटनाओं को किसी अन्य स्ट्रिंग से कैसे बदलें - REPLACE ()