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

基于单字段为SQL Server数据生成起止时间及关联明细行

解决SQL Server中明细行匹配表头行的问题

原始数据

IDStartDateTimeHeaderID
12020-12-14T13:07:01.87510000
22020-12-14T13:07:01.9760
32020-12-14T13:07:02.4960
42020-12-14T13:07:02.87510001
52020-12-14T13:07:03.9760
62020-12-14T13:07:04.8960
72020-12-14T13:07:05.87510003

方案1:生成每个表头的起止时间

利用SQL Server的LEAD()窗口函数,获取下一个表头的开始时间作为当前表头的结束时间,最后一个表头可自定义默认结束时间。

SELECT
    HeaderID,
    StartDateTime AS HeaderStartDateTime,
    LEAD(StartDateTime, 1, '2020-12-14T13:07:07.875') OVER (ORDER BY StartDateTime) AS HeaderEndDateTime
FROM
    YourTableName
WHERE
    HeaderID != 0
ORDER BY
    StartDateTime;

执行结果:

HeaderIDHeaderStartDateTimeHeaderEndDateTime
100002020-12-14T13:07:01.8752020-12-14T13:07:02.875
100012020-12-14T13:07:02.8752020-12-14T13:07:05.875
100032020-12-14T13:07:05.8752020-12-14T13:07:07.875

方案2:为明细行匹配对应的表头ID

提供两种实现方式,可根据数据量选择更高效的方案:

方法1:子查询匹配

通过子查询找到每条明细行对应的、时间最近的前置表头行:

SELECT
    d.ID,
    d.StartDateTime,
    (SELECT TOP 1 HeaderID
     FROM YourTableName h
     WHERE h.HeaderID != 0 AND h.StartDateTime <= d.StartDateTime
     ORDER BY h.StartDateTime DESC) AS HeaderID
FROM
    YourTableName d
WHERE
    d.HeaderID = 0;

方法2:表头区间关联(大表更高效)

先生成表头的时间区间临时表,再关联明细行匹配所属区间:

WITH HeaderRanges AS (
    SELECT
        HeaderID,
        StartDateTime AS StartRange,
        LEAD(StartDateTime, 1, '9999-12-31') OVER (ORDER BY StartDateTime) AS EndRange
    FROM YourTableName
    WHERE HeaderID != 0
)
SELECT
    d.ID,
    d.StartDateTime,
    hr.HeaderID
FROM YourTableName d
JOIN HeaderRanges hr ON d.StartDateTime >= hr.StartRange AND d.StartDateTime < hr.EndRange
WHERE d.HeaderID = 0;

执行结果:

IDStartDateTimeHeaderID
22020-12-14T13:07:01.97610000
32020-12-14T13:07:02.49610000
52020-12-14T13:07:03.97610001
62020-12-14T13:07:04.89610001

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 06:05:09