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

基于日期(时间差≤10分钟)的SQL数据集关联实现问询

当然可以实现这种基于时间差的关联!核心思路就是通过计算两个时间字段的差值,筛选出时间差≤10分钟的记录,同时别忘了匹配同一设备(你的两个查询里都有tu.Name,这应该是关联同一单元的关键)。

我把你的两个查询封装成CTE(公共表表达式),让代码结构更清晰,然后通过时间条件和设备名称来关联:

WITH VoyageEvents AS (
    SELECT 
        tu.Name AS UnitName,
        tv.VoyageNo, 
        tv.ExternalVoyageNo, 
        tve.VoyageEventCode, 
        tve.EventDate, 
        tve.WindSpeed, 
        tve.WindDirection, 
        tve.SeaStateCode, 
        tve.PositionLatitude, 
        tve.PositionLongitude, 
        tve.Speed, 
        tve.DistanceByLog, 
        tve.DistanceOverGround, 
        tve.HFOStock, 
        tve.LSFOStock, 
        tve.MDOStock, 
        tve.MGOStock, 
        tve.DraughxcID, 
        CASE 
            WHEN ts.IsBallast = 0 THEN 'Laden' 
            WHEN ts.IsBallast = 1 THEN 'Ballast' 
            ELSE 'In Port' 
        END AS Condition, 
        tcf.Mt 
    FROM dbo.xcVoyageEvent tve 
    INNER JOIN dbo.xcUnit tu ON tve.xcUnitID = tu.xcUnitID 
    INNER JOIN dbo.xcVoyage tv ON tve.xcVoyageID = tv.xcVoyageID 
    LEFT JOIN dbo.xcSailing ts ON tve.xcSailingID = ts.xcSailingID 
    LEFT JOIN dbo.xcCargo tc ON tve.xcVoyageID = tc.xcVoyageID 
    LEFT JOIN dbo.xcCargoFigure tcf ON tc.xcCargoID = tcf.xcCargoID 
    WHERE tve.RowDeleted = 0 
        AND tv.RowDeleted = 0 
        AND ts.RowDeleted = 0 
        AND tu.RowDeleted = 0 
        AND tve.VoyageEventCode IN(
            'Commence Sea Passage', 'Sea Passage Suspended', 'Sea Passage Resumed', 
            'End Of Sea Passage', 'xcdailyreport', 'Noon position', 'morning position', 
            'voyage commenced', 'voyage complete', 'Enter Magallanes Strait', 
            'Enter Suez Canal', 'All Clear', 'All Fast'
        )
),
MeasurementReadings AS (
    SELECT 
        tu.name AS UnitName,
        tc.Code AS ComponentCode, 
        tc.Name AS ComponentName, 
        xc.Name AS MeasurementName, 
        xcr.ReadingValue, 
        xcr.ReadingDate, 
        xcr.Comment 
    FROM dbo.xcMeasurement xc 
    INNER JOIN dbo.xcMeasurementReading xcr ON xc.xcMeasurementID = xcr.xcMeasurementID 
    INNER JOIN dbo.xcComponent tc ON xc.xcComponentID = tc.xcComponentID 
    INNER JOIN dbo.xcUnit tu ON xc.xcUnitID = tu.xcUnitID 
    WHERE xc.RowDeleted = 0 
        AND xcr.RowDeleted = 0 
        AND tu.RowDeleted = 0 
        AND xc.Consumption = 1
)
SELECT 
    ve.UnitName,
    ve.VoyageNo,
    ve.ExternalVoyageNo,
    ve.VoyageEventCode,
    ve.EventDate,
    ve.WindSpeed,
    ve.Condition,
    mr.ComponentCode,
    mr.ComponentName,
    mr.MeasurementName,
    mr.ReadingValue,
    mr.ReadingDate,
    -- 新增时间差字段,方便你验证结果是否符合要求
    ABS(DATEDIFF(MINUTE, ve.EventDate, mr.ReadingDate)) AS TimeDifferenceMinutes
FROM VoyageEvents ve
INNER JOIN MeasurementReadings mr 
    ON ve.UnitName = mr.UnitName  -- 确保是同一设备的记录,避免跨设备错误关联
    AND ABS(DATEDIFF(MINUTE, ve.EventDate, mr.ReadingDate)) <= 10  -- 时间差控制在10分钟内
ORDER BY ve.UnitName, ve.EventDate, mr.ReadingDate;

几个关键细节说明:

  • CTE封装:把两个独立查询变成可复用的临时数据集,让整体逻辑更易懂,也方便后续修改。
  • 设备匹配:通过UnitName关联,确保你关联的是同一设备的事件和读数,这一步很重要,不然会出现不同设备的时间巧合匹配。
  • 时间差计算:用DATEDIFF(MINUTE, ...)计算分钟级差值,取绝对值后判断是否≤10,完美满足你的时间范围要求。

额外优化建议:

如果你的数据量较大,这种时间范围关联可能会变慢,建议给EventDate和ReadingDate字段创建索引,同时xcUnit.xcUnitID作为关联键也应该有索引。

另外,如果出现一个事件对应多个符合条件的读数(或者反过来),你可以用ROW_NUMBER()筛选出最近的那条记录,比如:

WITH VoyageEvents AS (
    -- 同上定义
),
MeasurementReadings AS (
    -- 同上定义
),
RankedAssociations AS (
    SELECT 
        ve.*,
        mr.*,
        ABS(DATEDIFF(MINUTE, ve.EventDate, mr.ReadingDate)) AS TimeDiff,
        -- 按设备和事件分组,给每个匹配的读数按时间差排序,最近的排第1
        ROW_NUMBER() OVER (PARTITION BY ve.UnitName, ve.EventDate ORDER BY ABS(DATEDIFF(MINUTE, ve.EventDate, mr.ReadingDate))) AS Rank
    FROM VoyageEvents ve
    INNER JOIN MeasurementReadings mr 
        ON ve.UnitName = mr.UnitName
        AND ABS(DATEDIFF(MINUTE, ve.EventDate, mr.ReadingDate)) <= 10
)
SELECT * 
FROM RankedAssociations 
WHERE Rank = 1  -- 只保留每个事件最近的那个读数
ORDER BY UnitName, EventDate;

这样就能避免一对多的冗余结果,只保留最匹配的那条关联记录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:52:30