天新药业信息管理平台

 找回密码
 立即注册
搜索
查看: 11|回复: 0
打印 上一主题 下一主题

[技术分享] SQL语句:分组展示最近日期的一条数据

[复制链接]

0

主题

0

帖子

62

积分

知识分享者

Rank: 5Rank: 5

积分
62
跳转到指定楼层
楼主
发表于 2024-9-11 14:53:21 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 高鲁汉 于 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, 下载次数: 0)

方法二查询结果

方法二查询结果

1727530250246.jpg (1.78 KB, 下载次数: 0)

方法一查询结果

方法一查询结果

1727530114722.jpg (4.89 KB, 下载次数: 0)

数据库样表

数据库样表
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|江西天新药业股份有限公司

GMT+8, 2024-10-6 08:22 , Processed in 0.322881 second(s), 23 queries .

Powered by TianXin! X3.2

© 2001-2016 Comsenz Inc.

快速回复 返回顶部 返回列表