मैं ROW_NUMBER () का उपयोग कैसे करूं?


175

मैं ROW_NUMBER()पाने के लिए उपयोग करना चाहते हैं ...

  1. प्राप्त करने के लिए max(ROW_NUMBER())-> या मैं लगता है कि यह भी सभी पंक्तियों की गिनती होगी

मैंने करने की कोशिश की:

SELECT max(ROW_NUMBER() OVER(ORDER BY UserId)) FROM Users

लेकिन यह काम नहीं लगता ...

  1. ROW_NUMBER()दी गई जानकारी का एक टुकड़ा का उपयोग करने के लिए , यानी। अगर मेरा कोई नाम है और मैं जानना चाहता हूं कि नाम किस पंक्ति से आया है।

मुझे लगता है कि यह कुछ वैसा ही होगा जैसा मैंने # 1 के लिए किया था

SELECT ROW_NUMBER() OVER(ORDER BY UserId) From Users WHERE UserName='Joe'

लेकिन यह भी काम नहीं किया ...

कोई विचार?

जवाबों:


150

पहले प्रश्न के लिए, सिर्फ उपयोग क्यों नहीं?

SELECT COUNT(*) FROM myTable 

गिनती पाने के लिए।

और दूसरे प्रश्न के लिए, पंक्ति की प्राथमिक कुंजी वह है जिसका उपयोग किसी विशेष पंक्ति को पहचानने के लिए किया जाना चाहिए। कोशिश मत करो और उस के लिए पंक्ति संख्या का उपयोग करें।


यदि आप अपनी मुख्य क्वेरी में Row_Number () लौटाते हैं,

SELECT ROW_NUMBER() OVER (Order by Id) AS RowNumber, Field1, Field2, Field3
FROM User

फिर जब आप 5 पंक्तियों में वापस जाना चाहते हैं तो आप वर्तमान पंक्ति संख्या ले सकते हैं और वर्तमान पंक्ति -5 के साथ पंक्ति निर्धारित करने के लिए निम्नलिखित क्वेरी का उपयोग कर सकते हैं

SELECT us.Id
FROM (SELECT ROW_NUMBER() OVER (ORDER BY id) AS Row, Id
     FROM User ) us 
WHERE Row = CurrentRow - 5   

मेरी स्थिति में मुझे एक UserId दिया गया है, और मैं UserId प्राप्त करना चाहता हूं जो कि निश्चित संख्या में पंक्तियाँ हैं। यदि कोई पंक्ति हटा दी जाए तो क्या होगा? उस स्थिति में, मैं सिर्फ UserId - ऑफ़सेट नहीं जा सकता, क्योंकि तब मुझे सही रिकॉर्ड नहीं मिलेगा।

रिकॉर्ड की गिनती का चयन करने के लिए mytable से चुनिंदा गणना (1) का उपयोग करना बेहतर है। यह इतनी जल्दी और कुशल है
शिवजीत

46

यद्यपि मैं अन्य लोगों से सहमत हूं कि आप count()कुल पंक्तियों की संख्या प्राप्त करने के लिए उपयोग कर सकते हैं , यहां बताया गया है कि आप कैसे उपयोग कर सकते हैं row_count():

  1. पंक्तियों की कुल संख्या पाने के लिए:

    with temp as (
        select row_number() over (order by id) as rownum
        from table_name 
    )
    select max(rownum) from temp
  2. पंक्ति संख्याएँ प्राप्त करने के लिए जहाँ नाम मैट है:

    with temp as (
        select name, row_number() over (order by id) as rownum
        from table_name
    )
    select rownum from temp where name like 'Matt'

आप आगे उपयोग कर सकते हैं min(rownum)या max(rownum)क्रमशः मैट के लिए पहले या अंतिम पंक्ति पाने के लिए।

ये बहुत ही सरल कार्यान्वयन थे row_number()। आप इसे अधिक जटिल समूहीकरण के लिए उपयोग कर सकते हैं। उप क्वेरी का उपयोग किए बिना उन्नत समूहीकरण पर मेरी प्रतिक्रिया देखें


क्या आप यह बता सकते हैं कि उपयोग में लाए जाने वाले कॉलम को कैसे चुनें order by X? दूसरे शब्दों में, कैसे Xनिर्धारित किया जाना चाहिए? धन्यवाद!
केविन मेरेडिथ

@ केविनमेरीड: order by Xवह क्रम है जिसका उपयोग आप उस क्रम को निर्धारित करने के लिए करेंगे जिसमें पंक्तियों को सौंपा जाएगा ROW_NUMBERS()। याद रखें कि संबंधपरक डेटाबेस में टेबल, उनके नाम के बावजूद, औपचारिक आदेश नहीं है, इसलिए यदि आप "1" या "10" या "1337" पंक्ति को कॉल करना चाहते हैं, तो आपको पहले एक ORDER BYक्लॉज का उपयोग करके उन्हें ऑर्डर करने की आवश्यकता है , जो वह है जो OVER (ORDER BY X)खंड में जाता है ।
Wtrmute

25

यदि आपको तालिका की कुल पंक्ति गणना को वापस करने की आवश्यकता है, तो आप SELECT COUNT(*)कथन के लिए वैकल्पिक तरीके का उपयोग कर सकते हैं ।

क्योंकि SELECT COUNT(*)पंक्ति गणना को वापस करने के लिए एक पूर्ण तालिका स्कैन करता है, बड़ी तालिका के लिए बहुत लंबा समय लग सकता है। आप sysindexesइस मामले में इसके बजाय सिस्टम टेबल का उपयोग कर सकते हैं । एक ROWSस्तंभ है जिसमें आपके डेटाबेस में प्रत्येक तालिका के लिए कुल पंक्ति गणना शामिल है। आप निम्नलिखित चयन कथन का उपयोग कर सकते हैं:

SELECT rows FROM sysindexes WHERE id = OBJECT_ID('table_name') AND indid < 2

यह आपकी क्वेरी में लगने वाले समय को बहुत कम कर देगा।


आप पूर्ण तालिका स्कैन के बारे में सही हैं, लेकिन ध्यान दें कि यह आवश्यक रूप से क्लस्टर इंडेक्स स्कैन नहीं है, क्योंकि यह इसके लिए एक गैर-क्लस्टर इंडेक्स का उपयोग कर सकता है
योएल हलब

2
यह भी केवल Sql- सर्वर के लिए सही है, क्योंकि अन्य RDMBS ने चुनिंदा गिनती को अनुकूलित किया है
yoel halb

7

ROW_NUMBER() 1. से शुरू होने वाली प्रत्येक पंक्ति के लिए एक अद्वितीय संख्या देता है। आप आसानी से बस लिखकर इसका उपयोग कर सकते हैं:

ROW_NUMBER() OVER (ORDER BY 'Column_Name' DESC) as ROW_NUMBER

आप के बीच का अंतर पा सकते हैं Row_number(), Rank()और Dense_Rank() यहाँ


7

इसका उपयोग आप पहले रिकॉर्ड प्राप्त करने के लिए कर सकते हैं जहां क्लॉज है

SELECT TOP(1) * , ROW_NUMBER() OVER(ORDER BY UserId) AS rownum 
FROM     Users 
WHERE    UserName = 'Joe'
ORDER BY rownum ASC

4
SELECT num, UserName FROM 
 (SELECT UserName, ROW_NUMBER() OVER(ORDER BY UserId) AS num
  From Users) AS numbered
WHERE UserName='Joe'

सभी पंक्तियों की गणना करने के लिए - अन्यथा आप उन पंक्तियों की गणना कर रहे हैं जहां उपयोगकर्ता जो है, जो लक्ष्य नहीं है; ;-)।
एलेक्स मार्टेली

1
@ मैट: मुझे एक पेडेंट कहें; मैं "उप तालिका" शब्द के लिए "व्युत्पन्न तालिका" या "अनाम दृश्य" को पसंद करता हूं।
यांत्रिक_मीट

1
@adam, जैसा कि मैं एक पेडेंट भी हूं - क्या "नेस्टेड सेलेक्ट" आपको खुश कर देगा? जब तालिका या दृश्य जब कोई TABLEया VIEWकीवर्ड आसपास न हो ... जैसे शब्दों का उपयोग करना मुझे पसंद नहीं है ... लेकिन SELECTयकीन है! -)
एलेक्स मार्टेली

@ एलेक्स: आप एक वैध बिंदु प्रस्तुत करते हैं। "नेस्टेड सिलेक्ट" मेरे लिए बहुत अच्छा काम करता है :) वैसे, मैं वास्तव में आपके टिप्पणियों और उत्तरों को जोड़ने वाले उपाख्यानों को पढ़ने का आनंद लेता हूं।
मैकेनिकल_मीट

@ एडम, धन्यवाद! कभी-कभी मेरे उत्तर बहुत नंगे कोड होते हैं, जैसा कि यहाँ है, लेकिन मैं उनसे प्यार करना चाहता हूं जब मेरे पास एक स्पेयर ;-) होता है।
एलेक्स मार्टेली

4

यहां प्रश्न से संबंधित नहीं हो सकता है। लेकिन मैंने पाया कि यह उपयोगी हो सकता है ROW_NUMBER-

SELECT *,
ROW_NUMBER() OVER (ORDER BY (SELECT 100)) AS Any_ID 
FROM #Any_Table


2

यदि आप इसके लिए ROW_NUMBER का उपयोग करना चाहते हैं (गणना (*) के बजाय) तो आप हमेशा उपयोग कर सकते हैं:

SELECT TOP 1 ROW_NUMBER() OVER (ORDER BY Id)   
FROM USERS  
ORDER BY ROW_NUMBER() OVER (ORDER BY Id) DESC

2

आप Row_Numberसीमा क्वेरी परिणाम के लिए उपयोग कर सकते हैं ।

उदाहरण:

SELECT * FROM (
    select row_number() OVER (order by createtime desc) AS ROWINDEX,* 
    from TABLENAME ) TB
WHERE TB.ROWINDEX between 0 and 10

- उपरोक्त क्वेरी के साथ, मुझे परिणाम का पृष्ठ 1 मिलेगा TABLENAME


2

उपयोग करके आभासी तालिका बनाने की आवश्यकता है WITH table AS, जो कि दिए गए प्रश्न में उल्लिखित है।

इस वर्चुअल टेबल का उपयोग करके, आप CRUD ऑपरेशन wrt कर सकते हैं row_number

: QUERY

WITH table AS
-
(SELECT row_number() OVER(ORDER BY UserId) rn, * FROM Users)
-
SELECT * FROM table WHERE UserName='Joe'
-

आप इसके बावजूद INSERT, UPDATEया DELETEअंतिम वाक्य में उपयोग कर सकते हैं SELECT


0

SQL Row_Number () फ़ंक्शन संबंधित रिकॉर्ड सेट में डेटा पंक्तियों को क्रम संख्या को सॉर्ट करने और असाइन करने के लिए है। तो यह संख्या पंक्तियों के लिए उपयोग किया जाता है, उदाहरण के लिए शीर्ष 10 पंक्तियों की पहचान करने के लिए जिनके पास उच्चतम आदेश राशि है या प्रत्येक ग्राहक के आदेश की पहचान करते हैं जो सबसे अधिक राशि है, आदि।

यदि आप डेटासेट को क्रमबद्ध करना चाहते हैं और प्रत्येक पंक्ति को श्रेणियों में अलग-अलग करके हम पंक्तिबद्ध के साथ Row_Number () का उपयोग करते हैं। उदाहरण के लिए, प्रत्येक ग्राहक के आदेशों को अपने भीतर क्रमबद्ध करना जहां डेटासेट में सभी आदेश होते हैं, आदि।

SELECT
    SalesOrderNumber,
    CustomerId,
    SubTotal,
    ROW_NUMBER() OVER (PARTITION BY CustomerId ORDER BY SubTotal DESC) rn
FROM Sales.SalesOrderHeader

लेकिन जैसा कि मैं समझता हूं कि आप एक कॉलम द्वारा समूहीकृत पंक्तियों की संख्या की गणना करना चाहते हैं। आवश्यकता की कल्पना करने के लिए, यदि आप संबंधित ग्राहक के सभी आदेशों की गिनती को आदेश जानकारी के अलावा एक अलग कॉलम के रूप में देखना चाहते हैं, तो आप विभाजन के साथ COUNT () एकत्रीकरण फ़ंक्शन का उपयोग कर सकते हैं।

उदाहरण के लिए,

SELECT
    SalesOrderNumber,
    CustomerId,
    COUNT(*) OVER (PARTITION BY CustomerId) CustomerOrderCount
FROM Sales.SalesOrderHeader

0

यह प्रश्न:

SELECT ROW_NUMBER() OVER(ORDER BY UserId) From Users WHERE UserName='Joe'

सभी पंक्तियों वापस आ जाएगी जहां UserNameहै 'Joe'जब तक आप कोई हैUserName='Joe'

वे क्रम में सूचीबद्ध होंगे UserIDऔर row_numberक्षेत्र 1 और वेतन वृद्धि के साथ शुरू होगा, हालांकि कई पंक्तियों में शामिल हैंUserName='Joe'

यदि यह आपके लिए काम नहीं करता है तो आपकी WHEREकमांड में एक मुद्दा है या UserIDतालिका में कोई भी नहीं है। दोनों क्षेत्रों UserIDऔर के लिए वर्तनी की जाँच करें UserName

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.