2013-10-21 16 views
5

Nel database (SQL Server), per esempio, uno valori di colonna sono come:Come calcolare il rango dall'elenco dei numeri interi?

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

Questo è come lista di dati interi.

Classifica dovrebbe essere:

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

ho provato in modo seguente:

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 

ma funzionerà solo se i dati sono unici. Non riesce quando gli stessi valori "Col1" sono presenti in più righe mentre l'indice restituisce 0, 1, 2, 3, 4, 5, 6.

Come calcolare il punteggio quando l'elenco contiene dati che non sono distinti (nella maggior parte dei casi!) Utilizzando C# LINQ?

+0

cosa se prendendo valori distinti prima e poi fare lo scenario di cui sopra ... –

risposta

5

Perché non farlo nel database?

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

Ma se si deve farlo in C#

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

Questo è sbagliato. 'Dense_rank()' dovrebbe essere usato. Anche il codice C# è sbagliato. – GSerg

+0

Credo che la domanda dica rank = index + 1 – gleng

+0

@GSerg Non ho mai sentito parlare di quella funzione, grazie! – Romoku

1

Se volete farlo nel database (o eseguendo una query o selezionando da una vista), la query/vista dovrebbe essere in tal modo:

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

Questo è molto più facile e più veloce che farlo in C# o qualsiasi altro linguaggio che deve prima recuperare i dati e poi post-process esso.

+0

Se la domanda è "Come faccio a fare ciò usando C# LINQ?", quindi come è appropriata la risposta? Inoltre: come fai a sapere che la tua soluzione SQL è più veloce ... hai eseguito test rispetto a una soluzione C#? i tuoi numeri –

+1

Qualsiasi calcolo che SQL Server può eseguire per voi verrà eseguito più rapidamente rispetto a quando si recuperano i dati per la prima volta, quindi si esegue il calcolo su tali dati. Questo perché SQL Server può ottimizzare il modo in cui recupera i dati e il motore di calcolo è ottimizzato per la velocità. Questo non è solo il caso di un esempio ovvio come questo, ma anche quando si tratta di avere colonne calcolate in VIEW. Sì, ho eseguito test, molti anni fa e abbiamo persino eseguito calcoli molto complessi in SQL Server. –

+0

E qual è la risposta appropriata? Poiché l'OP potrebbe non essere consapevole del fatto che eseguire un calcolo in SQL Server è un'opzione valida. –

1

In C#:

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(); 
Problemi correlati