如何编写SQL查询分组最新一条满足指定条件且属于1月的记录
实现思路
要实现需求可以分两步处理:
- 先按
col1分组,给每组内的记录按日期倒序排列,标记出每组的最新一条记录 - 对标记出的最新记录做条件过滤,同时满足三个规则:
condition1 = 3、condition2 = 4、日期属于1月份
通用SQL实现(支持MySQL 8.0+、PostgreSQL、SQL Server等主流数据库)
用窗口函数ROW_NUMBER()实现分组排序,逻辑最清晰易读:
WITH ranked_data AS ( SELECT *, -- 按col1分组,日期倒序排序,序号为1的就是每组最新记录 ROW_NUMBER() OVER (PARTITION BY col1 ORDER BY STR_TO_DATE(date, '%d/%m/%Y') DESC) AS rn FROM your_table_name -- 替换成你自己的表名 ) SELECT col1, condition1, condition2, date FROM ranked_data WHERE rn = 1 -- 只保留每组最新一条 AND condition1 = 3 AND condition2 = 4 AND MONTH(STR_TO_DATE(date, '%d/%m/%Y')) = 1; -- 判断日期属于1月份
注:如果你表中的
date字段本身就是日期类型而非字符串,直接去掉STR_TO_DATE转换函数使用原生字段即可。
适配MySQL 5.x的实现(不支持窗口函数场景)
可以用关联子查询的方式取每组最新记录再过滤:
SELECT t1.* FROM your_table_name t1 -- 替换成你自己的表名 INNER JOIN ( -- 先查询每个col1对应的最大日期 SELECT col1, MAX(STR_TO_DATE(date, '%d/%m/%Y')) AS max_date FROM your_table_name GROUP BY col1 ) t2 ON t1.col1 = t2.col1 AND STR_TO_DATE(t1.date, '%d/%m/%Y') = t2.max_date WHERE t1.condition1 = 3 AND t1.condition2 = 4 AND MONTH(STR_TO_DATE(t1.date, '%d/%m/%Y')) = 1;
结果验证
对你提供的样例数据执行上述SQL后,只有col1=1234符合所有要求:
col1=5678的最新记录在2月,不符合月份要求col1=8901和3467的最新记录的condition1、condition2不满足等于3、4的要求
最终输出和你给出的期望结果完全一致。
内容的提问来源于stack exchange,提问作者Nithya Babu
相关产品推荐
相关产品推荐

