从linq的一次优化实践看group by+Min/Max()处理数据后需要额外的其他列问题
问题简化如下:
假设有第三方的表结构如下(可能会出现完全相同的重复数据):
1、写SQL语句,查询每个学生的,userid、最高分、最高分的科目、最高分的考点、最低分、最低分科目、最低分考点(分数相同的随机取第一条)
如结果集:
301 、95、英语、考点C、80、语文、考点A
302、90、英语、考点C、80、语文、考点A
2、使用linq实现题1
简单解析:
根据用户ID做GroupBy操作获取最高/最低分数后,需要获取最高/最低分所在行的其他列数据;另一方面排除重复数据或者相同分数的干扰
SQL最佳答案:
--测试数据结束
;WITH cte AS (
SELECT UserId ,
科目 ,
考点 ,
分数 ,
ROW_NUMBER() OVER ( PARTITION BY UserId, 分数 ORDER BY GETDATE() ) AS num
FROM TableA
)
SELECT t1.userid ,
t1.max分数 ,
t2.科目 ,
t2.考点 ,
t1.min分数 ,
t3.科目 ,
t3.考点
FROM ( SELECT UserId ,
MAX(分数) AS max分数 ,
MIN(分数) AS min分数
FROM TableA
GROUP BY UserId
) t1
JOIN cte t2 ON t2.UserId = t1.UserId
AND max分数 = t2.分数
AND t2.num = 1
JOIN cte t3 ON t3.UserId = t1.UserId
AND min分数 = t3.分数
AND t2.num = 1
linq刚开始,但是会产生重复分数等问题
from a in TableA
group a by a.UserId into b
select new {
UserId=b.Key,
maxScore= b.Min(p => p.分数),
minScore= b.Max(p => p.分数)
} into c
join d in TableA on new{UserId=c.UserId,Score=c.maxScore} equals new{UserId=d.UserId,Score=d.分数} into dtemp
from dd in dtemp.DefaultIfEmpty()
join e in TableA on new{UserId=c.UserId,Score=c.minScore} equals new{UserId=e.UserId,Score=e.分数} into etemp
from ee in etemp.DefaultIfEmpty()
select new{
UserId=c.UserId,
maxScore= c.maxScore,
max科目=dd.科目==null?"":dd.科目,
max考点=dd.考点==null?"":dd.考点,
minScore= c.minScore,
min科目=ee.科目==null?"":ee.科目,
min考点=ee.考点==null?"":ee.考点 }
优化后linq最佳实践
from m in Atts
group m by m.UserId into g
let uid=g.Key
let max=g.OrderByDescending(t=>t.分数).FirstOrDefault()
let min=g.OrderBy(t=>t.分数).FirstOrDefault()
select new{uid,max分数=max.分数,max科目=max.科目,max考点=max.考点,min.分数,min.科目,min.考点}
从linq的一次优化实践看group by+Min/Max()处理数据后需要额外的其他列问题的更多相关文章
- LINQ to SQL 语句(3) 之 Count/Sum/Min/Max/Avg
LINQ to SQL 语句(3) 之 Count/Sum/Min/Max/Avg [1] Count/Sum 讲解 [2] Min 讲解 [3] Max 讲解 [4] Average 和 Agg ...
- [转]LINQ语句之Select/Distinct和Count/Sum/Min/Max/Avg
在讲述了LINQ,顺便说了一下Where操作,这篇开始我们继续说LINQ语句,目的让大家从语句的角度了解LINQ,LINQ包括LINQ to Objects.LINQ to DataSets.LINQ ...
- LINQ to SQL语句(3)之Count/Sum/Min/Max/Avg
适用场景:统计数据吧,比如统计一些数据的个数,求和,最小值,最大值,平均数. Count 说明:返回集合中的元素个数,返回INT类型:不延迟.生成SQL语句为:SELECT COUNT(*) FROM ...
- sql:group by和 max
通过group by,having,max实现查询出每组里指定列中最大的内容 例如:我需要实现的功能是 获取每个模块中点击量最大的内容(表中有许多内容,内容里) 我写的查询语句如下 查询结果如下: 然 ...
- C# LINQ 详解 From Where Select Group Into OrderBy Let Join
目录 1. 概述 2. from子句 3. where子句 4. select子句 5. group子句 6. into子句 7. 排序子句 8. let子句 9. join子句 10. 小结 1. ...
- LINQ to SQL语句(6)之Group By/Having
适用场景:分组数据,为我们查找数据缩小范围. 说明:分配并返回对传入参数进行分组操作后的可枚举对象.分组:延迟 1.简单形式: var q = from p in db.Products group ...
- linq to sql (Group By/Having/Count/Sum/Min/Max/Avg操作符)
Group By/Having操作符 适用场景:分组数据,为我们查找数据缩小范围. 说明:分配并返回对传入参数进行分组操作后的可枚举对象.分组:延迟 1.简单形式: var q = from p in ...
- linq to sql (Group By/Having/Count/Sum/Min/Max/Avg操作符) (转帖)
http://wenku.baidu.com/link?url=2RsCun4Mum1SLbh-LHYZpTmGFMiEukrWAoJGKGpkiHKHeafJcx2y-HVttNMb1BqJpNdw ...
- [转]linq to sql (Group By/Having/Count/Sum/Min/Max/Avg操作符)
本文转自:http://www.cnblogs.com/jack-liang/archive/2011/03/22/1991554.html Group By/Having操作符 适用场景:分组数据, ...
随机推荐
- 通过减少 IO 实现性能的优化
原始地址见 这里 本文是工作中一点点简单的思考,不能保证是完全正确的,可能也仅仅是适用于部分场景. 场景 1:获取用户关注的好友列表中,每个好友的名字.头像等信息. 在很多公司中,不同的服务是由不同的 ...
- React项目使用React-Router
⒈初始化React项目(略) 请参考 初始化一个React项目(TypeScript环境) ⒉集成React-Router 在React世界里,公认最好用的路由是React-Router.那我们直接来 ...
- VK Cup 2017 - Round 1 (CDE)
771C Bear and Tree Jumps 大意: 给定树,每步能走到距离不超过$k$的任意点,记$f(s,t)$为$s$到$t$的最少步数,求$\sum\limits_{s<t}f(s, ...
- Maven添加依赖后如何在IDEA中引用
使用idea打开/创建maven项目,可以正常使用maven命令编译发布,但idea里智能提示.代码均找不到包,原因是idea并未引用依赖的包,这时需要添加idea引用即可 解决方法 在IDEA右侧的 ...
- metasploit情报收集
1.msf连接数据库 service postgresql start(postgresql默认用户名scott,密码tiger) msf > db_connect 用户名:密码@127.0.0 ...
- 【转载】Request对象的作用以及常见属性
Request对象是Asp.Net应用程序中非常重要的一个内置对象,其作用主要用于服务器端获取客户端提交过来的相应信息,比较常用的有使用Requset对象获取用户提交的html表单信息,Request ...
- 用D3js的区域生成器实现简单波浪图
最近做控件遇到含有波浪图的图表,一开始用Echarts虽然很快完成了,但Echarts的波浪图与其他图表的响应式不同步,于是学习了D3js,D3js写起来确实复杂一些,但能够实现的效果也更丰富,做的时 ...
- nginx 反向代理配置(一)
文章参考:https://blog.csdn.net/physicsdandan/article/details/45667357 什么是代理? 代理在普通生活中的意义就是本来 ...
- 解决 VUE项目过大nodejs内存溢出问题
今天在启动vue项目的时候报了这样一个错误, 如图所示:频繁出现此种情况,项目太大,导致内存溢出,排除代码问题外,可参照以下方式解决 // 全局安装increase-memory-limit npm ...
- Java 之 字符流
一.字符流 当使用字节读取文本文件时,可能会有一个小问题,就是遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储.所以 Java 提供了一些字符类,以字符为单位读写数据, ...