如何将含QUEUE_TYPE_ID和REQUEST_DATE的SQL表转换为FROM-TO列结构
SQL 相邻行映射转换实现方案
最优实现(支持 MySQL 8.0+/PostgreSQL/SQL Server/Oracle 等所有支持窗口函数的数据库)
核心用LEAD窗口函数直接取排序后的下一行值,无需额外CASE判断,天然符合需求中无后续行时返回NULL的规则:
SELECT QUEUE_TYPE_ID AS QUEUE_TYPE_ID_FROM, LEAD(QUEUE_TYPE_ID) OVER (ORDER BY REQUEST_DATE ASC) AS QUEUE_TYPE_ID_TO, REQUEST_DATE AS REQUEST_DATE_FROM, LEAD(REQUEST_DATE) OVER (ORDER BY REQUEST_DATE ASC) AS REQUEST_DATE_TO FROM 替换为你的实际表名 -- 如需和示例输出一致按日期倒序展示,新增以下排序语句 ORDER BY REQUEST_DATE DESC;
兼容老版本数据库实现(如 MySQL 5.x 不支持窗口函数的场景)
用自关联+子查询实现同等逻辑:
SELECT t1.QUEUE_TYPE_ID AS QUEUE_TYPE_ID_FROM, t2.QUEUE_TYPE_ID AS QUEUE_TYPE_ID_TO, t1.REQUEST_DATE AS REQUEST_DATE_FROM, t2.REQUEST_DATE AS REQUEST_DATE_TO FROM 替换为你的实际表名 t1 LEFT JOIN 替换为你的实际表名 t2 ON t2.REQUEST_DATE = ( SELECT MIN(REQUEST_DATE) FROM 替换为你的实际表名 t3 WHERE t3.REQUEST_DATE > t1.REQUEST_DATE ) ORDER BY t1.REQUEST_DATE DESC;
逻辑说明
两种方案都是先按REQUEST_DATE从小到大排序,为每一行匹配日期比它大的最近一行数据作为TO列的值,没有匹配行时TO列自动为NULL,输出结果和需求给出的示例完全一致。
内容的提问来源于stack exchange,提问作者Drewtheman
相关产品推荐
相关产品推荐

