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

如何使用MySQL提取各ID对应Value为call rs的最早时间行?

正确的MySQL查询方案:提取每个ID下最早的call rs记录

问题背景

我们有如下原始数据表:

ID      Value     Date
TT-12   call rs   2018-04-01 15:18:22
TT-12   srte er   2018-04-02 12:15:18
TT-12   efft rs   2018-04-03 13:04:08
TT-14   efft rs   2018-04-04 17:16:10
TT-14   call rs   2018-04-05 16:25:43
TT-14   srte rs   2018-04-06 21:11:47
TT-18   srte rs   2018-04-07 22:18:34
TT-18   call rs   2018-04-08 07:11:35
TT-18   call rs   2018-04-09 13:07:25

需求是提取每个指定ID下,Value为call rs且时间最早的记录,期望输出结果:

ID      Value     Date
TT-12   call rs   2018-04-01 15:18:22
TT-14   call rs   2018-04-05 16:25:43
TT-18   call rs   2018-04-08 07:11:35

现有语句的问题

你当前尝试的SQL存在语法和逻辑错误:

select ID,Value,Date from Table1 where ID in ('TT-12','TT-14','TT-18') and order by Value='call rs';
  • 语法上:WHERE子句后不能直接跟ORDER BY,且AND后面缺少有效条件;
  • 逻辑上:既没有筛选出Value='call rs'的记录,也没有针对每个ID找到对应的最早日期。

解决方案1:子查询分组找最小日期(兼容所有MySQL版本)

这种方法先通过子查询分组,获取每个目标ID下call rs记录的最小日期,再关联原表拿到完整记录:

SELECT t1.ID, t1.Value, t1.Date
FROM Table1 t1
INNER JOIN (
    -- 子查询:分组获取每个ID下call rs的最早日期
    SELECT ID, MIN(Date) AS min_date
    FROM Table1
    WHERE Value = 'call rs'
      AND ID IN ('TT-12','TT-14','TT-18')
    GROUP BY ID
) t2 
ON t1.ID = t2.ID AND t1.Date = t2.min_date
WHERE t1.Value = 'call rs';

解决方案2:窗口函数(MySQL 8.0+ 推荐使用)

如果你的MySQL版本是8.0及以上,用ROW_NUMBER()窗口函数可以更简洁地实现需求:

SELECT ID, Value, Date
FROM (
    SELECT 
        ID, 
        Value, 
        Date,
        -- 按ID分组,日期升序排序,给每条记录编号
        ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Date ASC) AS rn
    FROM Table1
    WHERE Value = 'call rs'
      AND ID IN ('TT-12','TT-14','TT-18')
) sub_query
-- 只取每个分组里编号为1的(即日期最早的)记录
WHERE rn = 1;

这两种方法都能准确得到你想要的结果,窗口函数的写法更直观易维护,适合新版本MySQL;子查询法则兼容所有MySQL版本。

内容的提问来源于stack exchange,提问作者Roy1245

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:54:40