2013-10-21 7 views
5

डेटाबेस (SQL सर्वर) में, कहते हैं, एक स्तंभ मान की तरह हैं:पूर्णांक की सूची से रैंक की गणना कैसे करें?

Col1 
==== 
10 
5 
15 
20 
5 
10 
2 

यह पूर्णांक डेटा की सूची की तरह है।

रैंक होना चाहिए:

Col1 Rank 
==== ==== 
20 1 
15 2 
10 3 
10 3 
5  4 
5  4 
2  5 

मैं निम्नलिखित तरीके से प्रयास किया है:

1) First sort the list of data in descending order of "Col1" value 
2) Find the index of a particular record using FindIndex() method. 
3) Then Rank = Index + 1 

लेकिन यह केवल तभी कार्य करेगा डेटा अद्वितीय हैं। यह विफल रहता है जब एकाधिक पंक्तियों में समान "Col1" मान मौजूद होते हैं क्योंकि सूचकांक 0, 1, 2, 3, 4, 5, 6 लौटा रहा है।

रैंक की गणना कैसे करें जब सूची में डेटा होता है जो सी # LINQ का उपयोग करके अलग नहीं है (ज्यादातर मामलों में!)?

+0

क्या हुआ अगर पहले और उसके बाद अलग-अलग मान लेने उपरोक्त परिदृश्य कर ... –

उत्तर

5

डेटाबेस में ऐसा क्यों नहीं करते?

SELECT [Col1], DENSE_RANK() OVER (ORDER BY Col1 DESC) AS [Rank] 
FROM Table 

लेकिन अगर आप सी # में यह करना चाहिए

var data = new List<int>(); 
var rankings = data.OrderByDescending(x => x) 
        .GroupBy(x => x) 
        .SelectMany((g, i) => 
         g.Select(e => new { Col1 = e, Rank = i + 1 })) 
        .ToList(); 
+2

यह गलत है। 'dense_rank()' का उपयोग किया जाना चाहिए। सी # कोड भी गलत है। – GSerg

+0

मुझे विश्वास है कि सवाल रैंक = इंडेक्स + 1 – gleng

+0

@GSerg मैंने कभी उस समारोह के बारे में नहीं सुना है, धन्यवाद! सुधार के लिए – Romoku

1

आप डेटाबेस में यह करना चाहते हैं (या तो एक प्रश्न चला कर या एक दृश्य से चयन करके), क्वेरी/दृश्य होना चाहिए इस प्रकार:

SELECT [Col1], DENSE_RANK() OVER (ORDER BY Col1 DESC) AS [Rank] 
FROM OriginalTable 

यह बहुत आसान है और सी # या किसी अन्य भाषा है कि पहली डेटा और फिर इसे बाद प्रक्रिया को पुनः प्राप्त करना होगा में यह कर की तुलना में तेजी है।

+0

यदि सवाल यह है कि "मैं सी # LINQ का उपयोग करके यह कैसे कर सकता हूं?", तो आपका उत्तर उचित कैसे है? इसके अलावा: आप कैसे जानते हैं कि आपका SQL समाधान तेज़ है ... क्या आपने सी # समाधान बनाम परीक्षण चलाए हैं? यदि हां, तो कृपया पोस्ट करें आपकी संख्या –

+1

कोई भी गणना जो SQL सर्वर आपके लिए कर सकती है, जब आप पहली बार डेटा प्राप्त करते हैं, तब से तेज़ी से चलेंगे, फिर उस डेटा पर गणना करें। ऐसा इसलिए है क्योंकि SQL सर्वर डेटा लाने के तरीके को अनुकूलित कर सकता है और इसकी गणना इंजन गति के लिए अनुकूलित किया गया है। यह सिर्फ इस तरह के एक स्पष्ट उदाहरण में मामला नहीं है, बल्कि जब भी VIEWs में गणना कॉलम होने की बात आती है। हां, मैंने कई साल पहले परीक्षण चलाए हैं, और हमने SQL सर्वर में बहुत जटिल गणना भी की है। –

+0

और उत्तर उचित कैसे है? चूंकि ओपी अनजान हो सकता है कि SQL सर्वर में गणना करना एक व्यवहार्य विकल्प है। –

1

सी # में:

var data = new List<int> { 10, 12, 7, 8, 7, 6, 3, 3, 4 }; 
var rankings = data.OrderByDescending(x => x).GroupBy(x => x) 
        .SelectMany((g, i) => 
         g.Select(e => new { Col1 = e, Rank = i + 1 })) 
        .ToList(); 
संबंधित मुद्दे