You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写SQL查询分组最新一条满足指定条件且属于1月的记录

实现思路

要实现需求可以分两步处理:

  1. 先按col1分组,给每组内的记录按日期倒序排列,标记出每组的最新一条记录
  2. 对标记出的最新记录做条件过滤,同时满足三个规则: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 15:21:02