以阶跃函数的形式检索有界时间段,其中周期开始返回 1,周期结束返回 0。MSSQL

问题描述 投票:0回答:1

我在 Microsoft SQL Server 中有一个名为

Downtime
的表,如下所示。我省略了一些不相关的字段和许多条目。

身份证 开始时间 结束时间
5 2024-03-27 09:07:20.653 2024-03-27 09:09:07.690
17 2024-03-27 09:59:50.557 2024-03-27 10:59:50.137
24 2024-03-27 11:04:07.497 2024-03-27 11:07:02.657

我需要编写一个查询,以以下格式返回上述数据:

t_邮票 目前正在下
2024-03-27 09:07:20.653 1
2024-03-27 09:09:07.690 0
2024-03-27 09:59:50.557 1
2024-03-27 10:59:50.137 0
2024-03-27 11:04:07.497 1
2024-03-27 11:07:02.657 0

换言之,此查询应将每个原始条目拆分为两个条目(一个

t_stamp
表示
StartTime
,一个
t_stamp
表示
EndTime
)并返回值 (
CurrentlyDown
) 1(如果
t_stamp
是来自
StartTime
字段)或 0(如果
t_stamp
来自
EndTime
字段)。

我可以考虑尝试两件事:

  • 围绕 ID 字段进行自连接,并使用
    CASE
    语句检查时间戳字段
  • 两个 CTE(一个专注于获取 StartTimes,另一个专注于 EndTimes),最终查询将这两个 CTE 围绕 ID 字段连接在一起。也许这里只需要一个 CTE?

我关心性能,所以我想尽可能高效地做到这一点。我距离 SQL 专家还很远,所以我真的不知道该走哪条路最好(如果有的话)。

sql-server datetime time-series sql-server-2008-r2 common-table-expression
1个回答
0
投票

这是使用

CROSS APPLY

的一种选择

示例

Select B.* 
 From  YourTable A
 Cross Apply ( values (StartTime,1)
                     ,(EndTime  ,0)
             ) B(t_stamp,currentlydown)

结果

t_stamp                   currentlydown
2024-03-27 09:07:20.653   1
2024-03-27 09:09:07.690   0
2024-03-27 09:59:50.557   1
2024-03-27 10:59:50.137   0
2024-03-27 11:04:07.497   1
2024-03-27 11:07:02.657   0
© www.soinside.com 2019 - 2024. All rights reserved.