You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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  -- 假设加油表包含交易时间字段
    );

注意事项

  1. 必须有车辆唯一标识字段(如VehicleID),否则无法正确分组
  2. 要有可靠的排序字段(如记录时间、自增ID),否则“上一条记录”的顺序会混乱
  3. 如果原始SQL过长,建议先单独测试里程表的Start K/End K生成逻辑,确认无误后再和其他表逐步关联拆解,这样更容易排查问题

内容的提问来源于stack exchange,提问作者Krishneil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:13:07