天新药业信息管理平台
标题: SQL语句:分组展示最近日期的一条数据 [打印本页]
作者: 高鲁汉 时间: 2024-9-11 14:53
标题: SQL语句:分组展示最近日期的一条数据
本帖最后由 高鲁汉 于 2024-9-28 21:31 编辑
问题:有一张表,列名为姓名,日期,分数,科目,使用mysql查询出每个姓名最近日期的分数
方法1:使用窗口函数(推荐,MySQL 8.0及以上)假设你的表名为scores,列名为姓名、日期、分数,其中日期是日期类型(DATE)。
- WITH RankedScores AS (SELECT 姓名,日期, 分数, ROW_NUMBER() OVER(PARTITION BY 姓名 ORDER BY 日期 DESC) AS rn FROM scores ) SELECT 姓名, 日期,分数 FROM RankedScores WHERE rn = 1;
复制代码这个查询首先使用WITH语句(公用表表达式,CTE)来创建一个临时结果集RankedScores,它包含了原表的所有列,并额外添加了一个rn列,该列通过ROW_NUMBER()窗口函数为每个姓名分组内的行按日期降序排列生成一个序号。然后,从RankedScores中选择rn = 1的行,即每个姓名最近日期的记录。
查询结果如下图所示:
方法2:使用子查询和分组(适用于所有MySQL版本)如果你使用的是MySQL的早期版本,不支持窗口函数,你可以使用子查询和分组来实现相同的结果。
- SELECT s1.姓名,s1.日期, s1.分数 FROM scores s1 INNER JOIN (SELECT 姓名, MAX(日期) AS 最新日期 FROM scores GROUP BY 姓名 ) s2 ON s1.姓名 = s2.姓名 AND s1.日期 = s2.最新日期;
复制代码这个查询首先在内层查询(子查询)中为每个姓名找到最新的日期(MAX(日期)),然后将这个结果作为临时表s2与原始表scores(别名s1)进行内连接。连接条件是姓名相同且日期等于该姓名对应的最新日期。这样,查询结果就包含了每个姓名最近日期的分数。
两种方法各有优势,如果你使用的是MySQL 8.0或更高版本,推荐使用窗口函数的方法,因为它更简洁、易读。如果你使用的是早期版本的MySQL,那么第二种方法将是你的选择。
查询结果如下图所示:
-
微信图片_20240928211256.png
(1.77 KB, 下载次数: 2)
方法二查询结果
-
1727530250246.jpg
(1.78 KB, 下载次数: 0)
方法一查询结果
-
1727530114722.jpg
(4.89 KB, 下载次数: 0)
数据库样表
欢迎光临 天新药业信息管理平台 (http://220.177.92.134:9091/) |
Powered by Discuz! X3.2 |