天新药业信息管理平台

标题: SQL语句:分组展示最近日期的一条数据 [打印本页]

作者: 高鲁汉    时间: 2024-9-11 14:53
标题: SQL语句:分组展示最近日期的一条数据
本帖最后由 高鲁汉 于 2024-9-28 21:31 编辑

问题:有一张表,列名为姓名,日期,分数,科目,使用mysql查询出每个姓名最近日期的分数


方法1:使用窗口函数(推荐,MySQL 8.0及以上)
假设你的表名为scores,列名为姓名、日期、分数,其中日期是日期类型(DATE)。
  1. 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的早期版本,不支持窗口函数,你可以使用子查询和分组来实现相同的结果。
  1. 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