当前位置: 首页 >数据库 > C#黔驴技巧之实现统计结果排名

C#黔驴技巧之实现统计结果排名

前言

本节是实现统计排名的一点技巧,可能有一部分童鞋在实现排名统计绕了一大圈,最后还不如两行代码就搞定,代码清晰而可读性强,接下来我们来一起来看看。

统计排名

我们知道在SQL Server中可以利用Row_Number、Rank等函数进行排名,在MySQL中可以利用变量方式来实现排名,对于计算操作我倾向于放在内存中来操作,而数据库只是做简单的操作,尽管各个数据库可能提供了对应函数来进行处理,但是一旦数据量大时,可能搁置到内存中计算不失为一种好的方式。接下来我们来看看在C#中如何利用LINQ来进行排名,比如我们需要统计截止到当前时间,患者咨询的医生的人次排名(同一患者在同一天咨询同一医生多次只算一次),假设我们从数据库查询出医生姓名和患者咨询医生的次数,如下:

public class Consult{public string Name { get; set; }public int Times { get; set; }public int Rank { get; set; }}
var consults = new List<Consult>(){new Consult() { Name = "张三", Times = 1 },new Consult() { Name = "李四", Times = 1 },new Consult() { Name = "王五", Times = 2 },new Consult() { Name = "赵六", Times = 3 },new Consult() { Name = "小明", Times = 0 },new Consult() { Name = "小红", Times = 0 }};

我们得到了所有医生被咨询的次数和姓名,接下来我们通过LINQ继续对其进行操作,这里最重要需要了解的是投影(Select或SelectMany)具有索引的参数,知道有索引这个参数一切就好办了,因为次数越大说明排名越靠前,所以首先我们需要对上述集合进行倒序,然后再对倒序后的结果通过次数进行分组,分组后将导致不同次数在不同集合中(反之,同次数在相同集合中),然后通过SelectMany获取到分组后的指定集合和索引,最后对此集合进行投影就得到了最终的结果排名,代码如下:

 var result = consults.OrderByDescending(d => d.Times).GroupBy(d => d.Times).SelectMany((g, i) => g.Select(e => new Consult(){Name = e.Name,Times = e.Times,Rank = i + 1})).ToList();

 C#黔驴技巧之实现统计结果排名 _ JavaClub全栈架构师技术笔记

总结

上述需注意索引从0开始,所以需要加1,同时针对相同次数排名会相同,通过此种实现排名的方式,逻辑清晰且代码精简,当然,投影中含有索引参数也还可应用于其他用途,只不过用于排名的场景还是比较多,暂且到这里,感谢您的阅读。

作者:Jeffcky
来源链接:https://www.cnblogs.com/CreateMyself/p/12720334.html

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。





本文链接:https://www.javaclub.cn/database/117495.html

标签:group by
分享给朋友:

“C#黔驴技巧之实现统计结果排名” 的相关文章

MySQL数据库(基础) 2022年05月16日 21:54:19
MYSQL查询空值/NULL值 2022年06月08日 16:44:33
mysql查询最后一条记录 2022年06月08日 19:25:45
mysql 查询表 所有字段 2022年06月09日 20:38:57
mysql 查询数据结果计算百分比 2022年06月11日 10:01:40
MYSQL根据日期查询 2022年06月11日 21:03:52
mysql 查询某字段最小的记录 2022年06月12日 13:41:31