SQL Server中如何按指定条件获取符合要求的下一行ToLoc值?
解决SQL Server中生成目标列的问题
需求回顾
- 若
Curr等于Dest,目标列直接显示ToLoc的值; - 若
Curr不等于Dest,显示同一Box和Step分区内、按EntryTime排序后下一个满足Curr=Dest条件的ToLoc值。
为什么LAST_VALUE不适用
你之前尝试的LAST_VALUE函数是取窗口分区内排序后的最后一条记录的值,但它无法筛选出"下一个满足Curr=Dest"的特定记录,而是会返回分区内所有行的最后一个ToLoc,不符合需求中的"下一个符合条件"的逻辑。
解决方案
可以使用OUTER APPLY关联同一Box+Step分组中,当前行EntryTime之后第一个满足Curr=Dest的记录,结合条件判断实现需求:
SELECT t.Box, t.Step, t.Curr, t.Dest, t.FromLoc, t.ToLoc, t.EntryTime, CASE WHEN t.Curr = t.Dest THEN t.ToLoc ELSE next_valid.ToLoc END AS Desired FROM @t t OUTER APPLY ( SELECT TOP 1 ToLoc FROM @t WHERE Box = t.Box AND Step = t.Step AND EntryTime > t.EntryTime AND Curr = Dest ORDER BY EntryTime ASC ) next_valid ORDER BY t.Box, t.Step, t.EntryTime;
方案说明
OUTER APPLY子查询:在同一Box和Step分组中,筛选出当前行之后(EntryTime > t.EntryTime)且满足Curr=Dest的记录,按EntryTime升序取第一条,即为需要的"下一个符合条件"的ToLoc;CASE条件判断:直接处理Curr=Dest的场景,否则使用OUTER APPLY返回的ToLoc值;- 保留原数据的排序逻辑,确保结果顺序与测试数据一致。
测试验证
执行上述SQL后,输出结果中的Desired列将完全匹配你提供的预期值。
内容的提问来源于stack exchange,提问作者ester
相关产品推荐
相关产品推荐

