我在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专家,所以我真的不知道哪条路是最好的(如果有的话).

推荐答案

这里有一个选项,使用CROSS APPLY

Example

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

Results

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

Sql相关问答推荐

表名数组

用于平均多个数据并与一个数据点进行比较以判断偏移量的SQL查询

返回包含列和包含其他列的列表的自定义查询

为什么在postgres中,横向连接比相关子查询快?

删除事务中的本地临时表

Access中执行INSERT INTO查询时出现错误消息

我可以在SQL的IN子句中使用比子查询包含的值更少的值吗?

排除具有部分匹配条件的记录

在SQL查询中查找客户端的最短日期比较列和多行

如何使用最后一个非 NULL 值在 PostgreSQL 列中填充 NULL 值

什么是 100.它与 100 有什么区别?

Postgres存在限制问题「小值」

BigQuery导航函数计算ID

Postgres如何在一个日历周中前进和回填值

如何在插入时将字符串'03-January-2023'转换为日期时间

如何在 DAX 中通过 Window 函数应用订单

忽略与给定列匹配的行的 LAG 函数

具有日期时间条件的存储过程

在给定列中具有特定值的行与 SQL 中的总行数的比率

来自 SQL Server 的树层次 struct 图的 JSON