2013-10-21 70 views
5

在數據庫(SQL Server)的,比方說,一個列值,如:如何從整數列表中計算排名?

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 

但是,如果數據是唯一的它只會工作。當索引返回0, 1, 2, 3, 4, 5, 6時,如果同一個「Col1」值出現在多行中,它將失敗。

如何使用C#LINQ來計算列表包含不明顯的數據(大多數情況下!)的等級?

+0

什麼,如果第一,然後採取不同的值做了上面的場景... –

回答

5

爲什麼不在數據庫中做到這一點?

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

但是如果你必須在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

這是不對的。應該使用'dense_rank()'。 C#代碼也是錯誤的。 – GSerg

+0

我相信這個問題說等級= index + 1 – gleng

+0

@GSerg我從來沒有聽說過這個功能,謝謝! – Romoku

1

如果你會做它在數據庫中(可以通過運行一個查詢或通過從視圖中選擇),查詢/視圖應該是因此:

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

這是容易得多,比C#或必須首先檢索數據,然後後處理任何其他語言做這件事更快。

+0

If問題是「我該如何使用C#LINQ來做這件事?」,那麼你的答案如何適當呢?另外:你怎麼知道你的SQL解決方案更快?你運行測試與C#解決方案嗎?如果是這樣,請發佈你的號碼。 –

+1

SQL Server可爲您執行的任何計算運行速度都比您首次獲取數據時快,然後對該數據執行計算。這是因爲SQL Server可以優化它提取數據的方式,並且其計算引擎針對速度進行了優化。這不僅僅是一個明顯的例子,還包括在VIEW中計算列的情況。是的,很多年前我都運行過測試,而且我們甚至在SQL Server中進行了非常複雜的計算。 –

+0

答案如何?因爲OP可能不知道在SQL Server中進行計算是一個可行的選擇。 –

1

在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();