根据两个时间戳列将单行拆分为多行
Split Single Row into Multiple Rows Based on Two Timestamp Columns
我要拆分以下记录:
DeviceId StartTime EndTime
------------------------------------------------------------
1001 2022-02-12 07:27:00.000 2022-02-12 16:23:00.000
1002 2022-02-14 03:36:00.000 2022-02-14 04:36:00.000
进入:
DeviceId Timestamp State
-------------------------------------------------
1001 2022-02-12 07:27:00.000 1
1001 2022-02-12 16:23:00.000 2
1002 2022-02-14 03:36:00.000 1
1002 2022-02-14 04:36:00.000 2
新的 State
列应基于 Timestamp
是 StartTime
( = 1) 还是 EndTime
( = 2)。
实现此目的的 t-sql
查询是什么?
您可以使用 VALUES
table 值构造函数反转 table:
SELECT t.DeviceId, v.[Timestamp], v.[State]
FROM YourTable t
CROSS APPLY (VALUES
(t.StartTime, 1),
(t.EndTime, 2)
) v ([Timestamp], [State])
如果要在生成值时添加条件,则需要不同的语句:
SELECT t.DeviceId, v.[Timestamp], v.[State]
FROM YourTable t
CROSS APPLY (VALUES
(CASE WHEN t.Status IN (0, 1) THEN t.StartTime END, 1),
(t.EndTime, 2)
) v ([Timestamp], [State])
我要拆分以下记录:
DeviceId StartTime EndTime
------------------------------------------------------------
1001 2022-02-12 07:27:00.000 2022-02-12 16:23:00.000
1002 2022-02-14 03:36:00.000 2022-02-14 04:36:00.000
进入:
DeviceId Timestamp State
-------------------------------------------------
1001 2022-02-12 07:27:00.000 1
1001 2022-02-12 16:23:00.000 2
1002 2022-02-14 03:36:00.000 1
1002 2022-02-14 04:36:00.000 2
新的 State
列应基于 Timestamp
是 StartTime
( = 1) 还是 EndTime
( = 2)。
实现此目的的 t-sql
查询是什么?
您可以使用 VALUES
table 值构造函数反转 table:
SELECT t.DeviceId, v.[Timestamp], v.[State]
FROM YourTable t
CROSS APPLY (VALUES
(t.StartTime, 1),
(t.EndTime, 2)
) v ([Timestamp], [State])
如果要在生成值时添加条件,则需要不同的语句:
SELECT t.DeviceId, v.[Timestamp], v.[State]
FROM YourTable t
CROSS APPLY (VALUES
(CASE WHEN t.Status IN (0, 1) THEN t.StartTime END, 1),
(t.EndTime, 2)
) v ([Timestamp], [State])