使用GROUP BY按最大日期分组后获取每组对应记录text字段的实现方法
按人员分组取最大日期对应整行记录的实现方法
你之前仅用GROUP BY取MAX(Date)无法拿到对应Text的核心原因是:SQL标准中GROUP BY的查询结果仅允许返回分组字段、聚合函数字段,未做聚合处理的非分组字段无法直接返回,因此无法直接绑定最大日期对应的Text值。
你可以用以下两种通用方案实现需求:
方案1:窗口函数法(适用于MySQL 8.0+、PostgreSQL、SQL Server等所有支持窗口函数的新版数据库)
SELECT Initials, Date, Text FROM ( SELECT Initials, Date, Text, -- 按人员分组,组内按日期倒序排序,排名1即为最大日期的行 ROW_NUMBER() OVER (PARTITION BY Initials ORDER BY Date DESC) AS rank_num FROM 你的实际表名 ) temp_table WHERE rank_num = 1;
说明:如果存在同一个人员同一天有多条记录的场景,需要把所有符合条件的行都返回时,将ROW_NUMBER()替换为RANK()即可。
方案2:关联子查询法(兼容所有旧版本数据库,例如MySQL 5.x)
SELECT t1.Initials, t1.Date, t1.Text FROM 你的实际表名 t1 INNER JOIN ( -- 先查询出每个人员对应的最大日期 SELECT Initials, MAX(Date) AS max_date FROM 你的实际表名 GROUP BY Initials ) t2 ON t1.Initials = t2.Initials AND t1.Date = t2.max_date;
注意事项
- 请提前确认
Date字段为日期类型,若为字符串格式存储需要先转为日期类型再做计算,避免出现字符串排序逻辑错误(例如字符串规则下1/10/2022会小于1/2/2022)。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

