如何使用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
相关产品推荐
相关产品推荐

