如何查询id_konsul=4的数据并获取同staflow的最新created_at记录
解决方案:筛选指定
id_konsul且每个staflow保留最新记录 嘿,我来帮你搞定这个SQL查询需求!首先明确你的核心需求:要筛选出id_konsul = 4的所有记录,并且当staflow值重复时,只保留对应created_at最新的那一条。
先回顾你提供的示例数据:
id id_konsul staflow created_at 1 4 1 21/05/2018 11.03 2 4 2 22/05/2018 11.03 3 4 3 23/05/2018 11.03 4 4 4 24/05/2018 11.03 5 4 5 25/05/2018 11.03 6 4 6 26/05/2018 11.03 7 4 7 27/05/2018 11.03 8 4 6 28/05/2018 11.03 9 4 7 29/05/2018 11.03 10 4 7 30/05/2018 11.03 11 4 8 31/05/2018 11.03
你期望的结果是每个staflow只留最新的那条,比如staflow=6保留id=8的记录,staflow=7保留id=10的记录。下面给你两种常用的实现方法:
方法一:使用窗口函数(推荐,清晰高效)
窗口函数是处理这类分组取最值问题的最优方案,这里用ROW_NUMBER()给每个staflow分组内的记录排序:
WITH ranked_records AS ( SELECT *, -- 按staflow分组,将created_at转成日期类型后倒序排序,标记行号 ROW_NUMBER() OVER ( PARTITION BY staflow ORDER BY STR_TO_DATE(created_at, '%d/%m/%Y %H.%i') DESC ) AS rn FROM your_table_name -- 替换成你的实际表名 WHERE id_konsul = 4 ) -- 筛选每个分组内行号为1的记录(即最新的那条) SELECT id, id_konsul, staflow, created_at FROM ranked_records WHERE rn = 1 ORDER BY staflow;
关键说明:
PARTITION BY staflow:把数据按staflow分成独立的分组STR_TO_DATE(created_at, '%d/%m/%Y %H.%i'):因为你的created_at是字符串格式,必须转成日期类型再排序,否则字符串排序会出现逻辑错误rn = 1:每个分组里行号为1的就是该组内最新的记录
如果你的数据库支持窗口函数(比如MySQL 8.0+、PostgreSQL、SQL Server等),优先用这个方法,逻辑清晰且性能优异。
方法二:子查询关联(兼容旧版本数据库)
如果你的数据库不支持窗口函数(比如MySQL 5.x),可以用子查询先找出每个staflow的最新时间,再关联原表获取完整记录:
SELECT t1.id, t1.id_konsul, t1.staflow, t1.created_at FROM your_table_name t1 JOIN ( -- 先计算每个staflow对应的最新created_at SELECT staflow, MAX(STR_TO_DATE(created_at, '%d/%m/%Y %H.%i')) AS max_created_at FROM your_table_name WHERE id_konsul = 4 GROUP BY staflow ) t2 ON t1.staflow = t2.staflow AND STR_TO_DATE(t1.created_at, '%d/%m/%Y %H.%i') = t2.max_created_at WHERE t1.id_konsul = 4 ORDER BY t1.staflow;
关键说明:
- 子查询
t2负责统计每个staflow的最新时间 - 原表
t1和t2通过staflow和转换后的created_at关联,匹配到对应的最新记录 - 注意:如果同一个
staflow有两条记录的created_at完全相同,这个方法会返回多条;如果需要保留所有相同时间的记录,可以把方法一中的ROW_NUMBER()换成RANK()
两种方法都能得到你期望的结果,根据你的数据库版本选择合适的即可。
内容的提问来源于stack exchange,提问作者WM_
相关产品推荐
相关产品推荐

