SQL Server:从odometerReading列生成Start K与End K两列需求
嘿,我来帮你搞定这个里程读数的问题!核心思路是用窗口函数抓取每辆车的上一条里程记录,轻松生成你要的Start K和End K列。
核心实现方案
SQL Server(其他主流数据库逻辑类似)里的LAG()函数正好适配这个场景——它能在同一分组内(按车辆分组)获取上一行的指定字段值。如果是车辆的第一条记录,LAG()会返回NULL,这时候直接用当前读数填充Start K即可。
先给你一个生成临时表#temp的基础示例:
-- 假设你的原始里程表为VehicleOdometer,包含关键字段: -- VehicleID:车辆唯一标识ID -- odometerReading:里程读数 -- RecordTime:记录读数的时间(用于排序,保证历史顺序正确) SELECT VehicleID, odometerReading AS [End K], -- 无历史记录时,Start K与End K值一致 ISNULL( LAG(odometerReading) OVER (PARTITION BY VehicleID ORDER BY RecordTime), odometerReading ) AS [Start K] INTO #temp FROM VehicleOdometer;
关键参数说明
PARTITION BY VehicleID:将数据按车辆分组,确保只匹配同一辆车的历史记录ORDER BY RecordTime:按记录时间排序,保证“上一条记录”是时间更早的有效读数ISNULL(...):处理无历史记录的边界情况,让Start K和End K保持一致
结合你的#FuelSummary片段
如果要把这个逻辑和你现有的#FuelSummary关联(比如给每条加油记录匹配对应里程区间),可以先用CTE预处理里程数据,再进行关联:
WITH OdometerData AS ( SELECT VehicleID, odometerReading AS [End K], ISNULL(LAG(odometerReading) OVER (PARTITION BY VehicleID ORDER BY RecordTime), odometerReading) AS [Start K], RecordTime FROM VehicleOdometer ) SELECT fs.Code, fs.[Driver Name], od.[Start K], od.[End K] FROM #FuelSummary fs -- 根据业务逻辑关联,比如匹配加油时间对应的最新里程记录 JOIN OdometerData od ON fs.VehicleID = od.VehicleID AND od.RecordTime = ( SELECT MAX(RecordTime) FROM VehicleOdometer WHERE VehicleID = fs.VehicleID AND RecordTime <= fs.FuelTransactionTime -- 假设加油表包含交易时间字段 );
注意事项
- 必须有车辆唯一标识字段(如
VehicleID),否则无法正确分组 - 要有可靠的排序字段(如记录时间、自增ID),否则“上一条记录”的顺序会混乱
- 如果原始SQL过长,建议先单独测试里程表的
Start K/End K生成逻辑,确认无误后再和其他表逐步关联拆解,这样更容易排查问题
内容的提问来源于stack exchange,提问作者Krishneil
相关产品推荐
相关产品推荐

