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

求MySQL循环查询语句:按动作类型转换日期字段并合并记录

嘿,看了你的需求,是要把action_type=1的日期作为起始(add_date),紧接着对应的action_type=2日期作为结束(end_date),按同一ministry_id和building_id配对成目标结果对吧?

下面给你两种实现方案,优先推荐用窗口函数的版本,更简洁高效:

方案一:用窗口函数(MySQL 8.0+)

这是最直观的写法,利用LEAD()窗口函数直接获取下一条记录的日期,正好对应起始后的结束时间:

SELECT 
    ministry_id,
    building_id,
    action_date AS add_date,
    LEAD(action_date) OVER (
        PARTITION BY ministry_id, building_id 
        ORDER BY action_date
    ) AS end_date
FROM 
    your_table_name  -- 记得替换成你的实际表名
WHERE 
    action_type = 1;

关键部分解释

  • PARTITION BY ministry_id, building_id:限定只在同一个部门和同一栋建筑的记录范围内处理,避免跨组配对
  • ORDER BY action_date:确保记录按时间顺序排列,这样LEAD()取到的就是当前起始记录之后最接近的结束记录
  • WHERE action_type = 1:只保留作为起始点的记录,因为每个起始对应一个结束,最终结果正好是你要的配对数据
方案二:自连接(兼容低版本MySQL)

如果你的MySQL版本低于8.0,不支持窗口函数,可以用自连接的方式实现:

SELECT 
    t1.ministry_id,
    t1.building_id,
    t1.action_date AS add_date,
    MIN(t2.action_date) AS end_date
FROM 
    your_table_name t1
JOIN 
    your_table_name t2 
    ON t1.ministry_id = t2.ministry_id 
    AND t1.building_id = t2.building_id 
    AND t2.action_date > t1.action_date 
    AND t2.action_type = 2
WHERE 
    t1.action_type = 1
GROUP BY 
    t1.ministry_id, t1.building_id, t1.action_date;

思路说明

给每个起始记录(action_type=1),关联同一个部门建筑下、时间在它之后的所有结束记录(action_type=2),然后用MIN(t2.action_date)取最早的那个结束日期,正好对应配对的结束时间。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:44:18