在数据库(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();
答案 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)
}