通过sql分组查询数据时,一般通过group by来完成,group by默认取相同的分组列(一列或者多列)中第一个数据。

如果想获取sql分组中id最大的记录,我们可能想到的sql如下(name列作为分组):

select id,name from (select id,name from tt order by id desc) as t group by name

不过执行该sql发现并不能达到我们的目的,输出数据如下:

// 表数据如下:
id,name
1,name1
2,name1
3,name2
4,name2select id,name from (select id,name from tt order by id desc) as t group by name
// 输出结果如下:
id,name
1,name1
3,name2

这是为什么呢?因为mysql 5.6之后版本对排序的sql解析做了优化,子查询中的排序是会被忽略的,所以上面的order by id desc未起到作用。如果子语句中排序不做优化那不就可以了么,查阅资料发现可以在子语句中加上limit来避免这种优化(加上limit相当于临时表限定了取值范围不会进行优化,如果是全表的话就被优化掉了)。

// 加上limit
select id,name from (select id,name from tt order by id desc limit 1024) as t group by name// 输出结果如下:
id,name
2,name1
4,name

除了上述这种直接通过group by分组得到id最大记录之外,还可以通过分组获取到最大记录id,然后通过id获取对应记录(这里的id只要是记录的关键key即可)。

// 通过分组获取关键key,然后再获取对应记录
select id,name from tt where id in (select max(id) from tt group by name)// 输出结果如下:
id,name
2,name1
4,name2

其实除了group by获取分组最后一个记录之外,还可以通过关联子查询方式来实现:

select id,name from tt a where id = (select max(id) from tt where name = a.name) order by name// 输出结果如下
id,name
2,name1
4,name2

通过以上group by和关联子查询两种方式的实现,获取分组的最后一条记录要么直接通过分组直接来获取,要么先获取到记录关键key然后通过关键key获取对应的记录即可。

推荐阅读

Transmittable-Thread-Local:阿里开源的线程间上下文传递解决方案​mp.weixin.qq.com

线程池如何传递线程上下文信息​mp.weixin.qq.com

一起聊聊3个线程依次打印1、2、3...的故事​mp.weixin.qq.com

sql server如何输出排序序号_Group by中子查询order by排序失效问题分析相关推荐

  1. SQL Server调优系列基础篇(子查询运算总结)

    前言 前面我们的几篇文章介绍了一系列关于运算符的介绍,以及各个运算符的优化方式和技巧.其中涵盖:查看执行计划的方式.几种数据集常用的连接方式.联合运算符方式.并行运算符等一系列的我们常见的运算符.有兴 ...

  2. sqlserver2012链接远程服务器,修复︰ 在 SQL Server 2012年链接服务器和远程服务器上的不同排序规则的数据更新时性能降低...

    修补程序信息可以从 Microsoft 获得受支持的修复程序.然而,此修补程序仅用于解决本文中描述的问题.仅对出现这一特定问题的系统应用此修补程序. 如果此修复程序可供下载,则在此知识库文章的顶部会出 ...

  3. 【SQL Server数据迁移】链接服务器、分布式查询

    链接服务器为SQL Server提供了从远程数据源访问数据的能力,可以执行查询.修改数据.远程过程调用.远程数据源可以是同类的(数据源可以是另一个SQL Server实例),也可以是不同类的(其他关系 ...

  4. 基于C#+SQL Server(WinForm)学生选课及成绩查询管理系统【100010027】

    学生选课及成绩查询管理系统的设计与开发 1.项目背景 学生选课及成绩查询系统是一个学校不可缺少的部分,传统的人工管理档案的方式存在着很多的缺点,如:效率低.保密性差等,所以开发一套综合教务系统管理软件 ...

  5. SQL基础学习总结:5(HAVING子句的使用ORDER BY排序子句的使用)

    为聚合结果指定条件 HAVING子句 HAVING子句可以让我们筛选分组之后的各种数据,其语法结构如下: SELECT <列名1>,<列名2>,<列名3> FROM ...

  6. SQL Server中的报表–结合T-SQL和DAX查询以生成有效的报表

    介绍 (Introduction) With today's challenging economic times it has become more and more important to m ...

  7. 如何在SQL Server 2016中使用并行插入以提高查询性能

    介绍 (Introduction ) In the first part of this article, we will discuss about parallelism in the SQL S ...

  8. dbForge Studio for SQL Server入门教程:如何创建和编辑查询

    2019独角兽企业重金招聘Python工程师标准>>> [dbForge Studio for SQL Server下载] 创建查询: 1.创建服务器连接.有关如何创建服务器连接的详 ...

  9. 使用sql server Management Studio(企业管理器)或查询分析器管理数据库

    使用sql server Management Studio(企业管理器)管理数据库 sql server数据库中至少包含两个文件--数据库文件和事务日志文件. 数据库文件:一个数据库可以有一个或多个 ...

最新文章

  1. java string类api_JAVA中String类的常用方法API
  2. iOS 流媒体 基本使用 和方法注意
  3. vsc 搜索特定代码_特定问题的通用解决方案:何时编写代码以及何时编写代码...
  4. Linux目录架构详解
  5. Rman创建DG环境
  6. Matlab 实现信号滤波
  7. 超硬核十万字!全网最全 数据结构 代码,随便秒杀老师/面试官,我说的
  8. 【C++】 【判定质数】 【分解质因数】【筛质数(编制质数表)】
  9. (计算圓柱体的体积)编写程序,读入圆柱体的半径和高,并使用下列公式计算圆柱的体积
  10. PLC编程与实践——基础实验
  11. 阳光下,我们是幸福的孩子
  12. 商业价值(PgMP)
  13. 多摩川绝对值编码器CPLD FPGA通信源码(VHDL格式+协议+说明书)
  14. Dotween简单安装设置
  15. Java9-17新特性
  16. 边缘检测系列5:【CED】添加了反向细化路径的 HED 模型
  17. linux上sendmail配置文件,linux系统SendMail详细配置
  18. Flutter练习:gridview分页
  19. linux云计算基础(云计算介绍)
  20. go race 检测

热门文章

  1. LeetCode 1335. 工作计划的最低难度(DP)
  2. fluent瞬态计算终止条件在哪里设置_Fluent案例7【圆柱绕流】
  3. linux远程工具_【linux实操3.1】linux远程连接工具Secure的使用
  4. python基础实例 韦玮 pdf_Python基础实例教程(微课版)
  5. 灰色关联分析_灰色关联分析模型研究综述
  6. python清除列表内容_Python 列表的清空方式
  7. python网站攻击脚本_Python scapy 实现一个简易 arp 攻击脚本
  8. Spring Boot应用的后台运行配置
  9. 论文浅尝 | Data Intelligence 已出版的知识图谱主题论文
  10. 会议 | 2019 全国知识图谱与语义大会 (CCKS 2019)