如何将CTE生成的DATETIME列表转换为不重复的<from>-<to>时间对?
解决CTE时间两两配对且不重复使用的问题
方法一:使用LEAD()窗口函数
直接利用窗口函数获取下一行的时间,再过滤奇数行号的记录,写法简洁高效:
SELECT datetime AS `from`, LEAD(datetime) OVER (ORDER BY rn) AS `to` FROM your_final_cte WHERE rn % 2 = 1;
方法二:自连接+奇数行筛选
如果更习惯自连接的写法,仅对奇数行号的记录做连接操作:
SELECT t1.datetime AS `from`, t2.datetime AS `to` FROM your_final_cte t1 INNER JOIN your_final_cte t2 ON t2.rn = t1.rn + 1 WHERE t1.rn % 2 = 1;
原理说明
常规自连接(t1.rn = t2.rn -1)会生成所有相邻行的配对(比如1-2、2-3、3-4),而通过rn % 2 = 1筛选出奇数行号的记录,就能只保留1-2、3-4这类间隔配对,确保每个时间值仅被使用一次,完全匹配你需要的输出结果。
注意:这里默认你的CTE生成的rn是连续递增的整数(按datetime排序后的行号),如果行号存在断号情况,可以先用ROW_NUMBER()重新生成连续行号后再执行上述逻辑。
内容的提问来源于stack exchange,提问作者xxxprxxx
相关产品推荐
相关产品推荐

