如何在SQL Server中补全缺失的Dept_Dt并计算航班时长
解决SQL中用下一条记录的Arrival_Dt替换Dept_Dt NULL值并计算时长的问题
针对你的需求,我们可以用SQL Server的**窗口函数LEAD()**来轻松获取下一条记录的Arrival_Dt,以此替换当前行的Dept_Dt NULL值,之后再进行时长计算。
完整解决方案代码
SELECT Flight_ID AS ID, Arrival_Dt, -- 用下一条记录的Arrival_Dt替换当前Dept_Dt的NULL值 ISNULL(Dept_Dt, LEAD(Arrival_Dt) OVER (ORDER BY Arrival_Dt)) AS Dept_Dt, -- 计算天数 DATEDIFF(SECOND, Arrival_Dt, ISNULL(Dept_Dt, LEAD(Arrival_Dt) OVER (ORDER BY Arrival_Dt))) / (60 * 60 * 24) AS D, -- 计算小时数(取余24) DATEDIFF(SECOND, Arrival_Dt, ISNULL(Dept_Dt, LEAD(Arrival_Dt) OVER (ORDER BY Arrival_Dt))) / (60 * 60) % 24 AS H, -- 计算分钟数(取余60) DATEDIFF(SECOND, Arrival_Dt, ISNULL(Dept_Dt, LEAD(Arrival_Dt) OVER (ORDER BY Arrival_Dt))) / 60 % 60 AS M, -- 计算总小时数 CAST(ISNULL(Dept_Dt, LEAD(Arrival_Dt) OVER (ORDER BY Arrival_Dt)) - Arrival_Dt AS FLOAT) * 24 AS TOTAL_HRS FROM TEMP;
关键部分解释
LEAD(Arrival_Dt) OVER (ORDER BY Arrival_Dt):LEAD()函数用于获取当前行之后指定位置的行数据,这里我们取下一行的Arrival_DtOVER (ORDER BY Arrival_Dt)确保数据按到达时间排序,保证我们获取的是正确的"下一条记录"
ISNULL(Dept_Dt, ...):- 检查当前行的
Dept_Dt是否为NULL,如果是,则用LEAD()获取的下一行Arrival_Dt替换;如果不为NULL,保留原数值
- 检查当前行的
针对你的测试数据的执行结果
这条SQL会生成和你期望的TEMP2表查询完全一致的结果:
- 第二条记录的
Dept_Dt会被替换为10/14/2018 11:44 PM - 计算出的时长为1分钟(D=0, H=0, M=1, TOTAL_HRS≈0.0167),完全符合你的预期
额外说明
如果你的表中存在最后一行Dept_Dt为NULL的情况,LEAD()会返回NULL,这时候你可以根据需求添加默认值(比如用GETDATE()或者其他逻辑),例如:
ISNULL(Dept_Dt, ISNULL(LEAD(Arrival_Dt) OVER (ORDER BY Arrival_Dt), GETDATE()))
内容的提问来源于stack exchange,提问作者joe
相关产品推荐
相关产品推荐

