我在Microsoft SQL Server中有一个名为Downtime
的表,它看起来像这样(我忽略了一些不相关的列和许多条目):
ID | StartTime | EndTime |
---|---|---|
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_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 |
换句话说,这个查询应该将每个原始条目分成两个条目(一个t_stamp
代表StartTime
,一个t_stamp
代表EndTime
),并返回值(CurrentlyDown
)1(如果t_stamp
来自StartTime
列)或0(如果t_stamp
来自EndTime
列).
我可以try 两件事:
- ID字段周围的自连接,使用
CASE
语句判断时间戳字段 - 两个CTE(一个集中在抓取StartTimes,另一个集中在EndTimes),最后一个查询将这两个CTE连接在一起围绕ID列.也许这里只需要一个CTE?
我关心的是性能,所以我想尽可能高效地做这件事.我不是SQL专家,所以我真的不知道哪条路是最好的(如果有的话).