Transpose\pivot 一对包含两列的行,其中一列是日期时间,另一列是 SQL 服务器中的文本
Transpose\pivot pair of rows with two columns where one is DateTime and the other Text in SQL Server
我有以下table结构和数据:
数据按 ASC 顺序排列,每个 Master Clear
都有一个后续的 Blend Closed
。如果没有后续的 Blend Closed
那么它应该收到 NULL
.
现在我想得到以下结果:
Master Clear Blend Closed
2018-09-17 03:12:03 2018-09-17 10:00:03
2018-09-17 10:37:03 2018-09-18 01:05:02
2018-09-18 04:55:02 2018-09-18 21:51:00
2018-09-18 22:55:00 2018-09-19 03:02:01
. .
. .
. .
2018-09-23 20:10:56 NULL
这是获取行对并将 Time
列值移动到其适当的 Value
列:Master Clear
或 Blend Closed
.
我试图得到这个数据形状,但无论如何都做不到。有什么方法可以使用 T-SQL?
实现此输出
一个选项是为每个值组分配一个行号,然后执行常规数据透视查询:
WITH cte AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY Value ORDER BY Time) rn
FROM [BUR_BLEND].[dbo].[BLEND_START_END_TIMES]
)
SELECT
MAX(CASE WHEN Value = 'Master Clear' THEN Time END) AS [Master Clear],
MAX(CASE WHEN Value = 'Blend Closed' THEN Time END) AS [Blend Closed]
FROM cte
GROUP BY rn
ORDER BY rn;
请注意,此答案假设 Master Clear
和 Blend Closed
记录总是以逻辑对的形式出现,并且没有间隙。如果没有,那么我们将不得不做更多的工作来生成您的输出。
我有以下table结构和数据:
数据按 ASC 顺序排列,每个 Master Clear
都有一个后续的 Blend Closed
。如果没有后续的 Blend Closed
那么它应该收到 NULL
.
现在我想得到以下结果:
Master Clear Blend Closed
2018-09-17 03:12:03 2018-09-17 10:00:03
2018-09-17 10:37:03 2018-09-18 01:05:02
2018-09-18 04:55:02 2018-09-18 21:51:00
2018-09-18 22:55:00 2018-09-19 03:02:01
. .
. .
. .
2018-09-23 20:10:56 NULL
这是获取行对并将 Time
列值移动到其适当的 Value
列:Master Clear
或 Blend Closed
.
我试图得到这个数据形状,但无论如何都做不到。有什么方法可以使用 T-SQL?
实现此输出一个选项是为每个值组分配一个行号,然后执行常规数据透视查询:
WITH cte AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY Value ORDER BY Time) rn
FROM [BUR_BLEND].[dbo].[BLEND_START_END_TIMES]
)
SELECT
MAX(CASE WHEN Value = 'Master Clear' THEN Time END) AS [Master Clear],
MAX(CASE WHEN Value = 'Blend Closed' THEN Time END) AS [Blend Closed]
FROM cte
GROUP BY rn
ORDER BY rn;
请注意,此答案假设 Master Clear
和 Blend Closed
记录总是以逻辑对的形式出现,并且没有间隙。如果没有,那么我们将不得不做更多的工作来生成您的输出。