如何从整数列表中计算排名?

时间:2013-10-21 11:46:10

标签: c# sql-server linq ranking rank

在数据库(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列表包含不同的数据(在大多数情况下!),如何计算排名?

4 个答案:

答案 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();

答案 1 :(得分:1)

如果您要在数据库中执行此操作(通过运行查询或从VIEW中选择),则查询/视图应如此:

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

这比使用C#或任何其他必须首先检索数据然后对其进行后处理的语言更容易,更快。

答案 2 :(得分: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();

答案 3 :(得分:0)

options:{
     aspectRatio:4 //(width/height)
}