求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
相关产品推荐
相关产品推荐

