从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操作符 适用场景:分组数据, ...
随机推荐
- MyBatis逆向工程生成配置 generator (生成pojo、mapper.xml、mapper.java)
MyBatis逆向工程生成 mybatis需要程序员自己编写sql语句,mybatis官方提供逆向工程,可以针对单表自动生成mybatis执行所需要的代码(mapper.java.mapper.xml ...
- Win10 将本地连接设置为按流量计费网络
在Win10中默认是不允许用户将本地连接设置为按流量计费网络的,不过我们可以通过修改注册表的方式来实现. 将本地连接设置为按流量计费网络后,Windows更新将不会自动下载.同样,Windows应用商 ...
- Python函数基础学习(定义、函数参数、递归函数)
1.本程序是测试函数的基础.函数的参数.递归函数的测试. 函数的参数有: 必选参数.默认参数.可变参数.命名关键字参数和关键字参数 #!/usr/bin/python # -*- coding: ut ...
- Python中关于Lambda函数的使用总结
lambda表达式是一种匿名函数,对应python中的自定义函数def,是定义某个函数时比较高级的一种写法.作为python初学者,本文整理了lambda的一些基本用法和特点. lambda和def的 ...
- 17 SUMIF函数、countif函数、averagif函数
情景 按买家求他们的消费各是多少. 可以考虑使用分类汇总来做,但这里我们使用函数sumif来做. SUMIF函数 格式:=SUMIF(条件列表,匹配条件,数据区) 该函数这样理解:按照匹配条件,从条件 ...
- JVM内存管理(一)--GC简介
GC策略解决了哪些问题? 既然是要进行自动GC,那必然会有相应的策略,而这些策略解决了哪些问题呢,粗略的来说,主要有以下几点. 1.哪些对象可以被回收. 2.何时回收 ...
- javascript之instanceof
定义和用法 instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上. 语法: object instanceof construct ...
- ajax实现文件上传,多文件上传,追加参数
1.html部分实现代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...
- [转]Entity Framework 异常: 'OFFSET' 附近有语法错误。\r\n在 FETCH 语句中选项 NEXT 的用法无效
https://blog.csdn.net/weixin_34321977/article/details/85850064 在使用 EF 的时候,突然发现更新后在服务器中运行出错,异常信息主要包含以 ...
- Python Scrapy 实战
Python Scrapy 什么是爬虫? 网络爬虫(英语:web crawler),也叫网络蜘蛛(spider),是一种用来自动浏览万维网的网络机器人.其目的一般为编纂网络索引. Python 爬虫 ...