多行的 PIVOT 日期时间和 ORDER 列值

PIVOT datetime and ORDER column values of multiple rows

我有一个 table 值不按顺序排列

Id DateTime Status
1 2022-03-01 18:00:00.000 Stop1
2 2022-03-01 08:00:00.000 Start
3 2022-03-01 20:00:00.000 Stop2
4 2022-03-02 09:00:00.000 Start
5 2022-03-01 10:00:00.000 Stop2
6 2022-03-02 11:00:00.000 Finish
7 2022-03-01 14:00:00.000 Start
8 2022-03-02 10:00:00.000 Stop1

其中状态可以是 'Start'、'Stop1'、'Stop2' 或 'Finish'。

我需要这样的时间线,其中值按顺序旋转(从最早到最新;此时 id 不相关)

Id Start Stop1 Stop2 Finish
2 2022-03-01 08:00:00 NULL 2022-03-01 10:00:00 NULL
7 2022-03-01 14:00:00 2022-03-01 18:00:00 2022-03-01 20:00:00 NULL
4 2022-03-02 09:00:00 2022-03-02 10:00:00 NULL 2022-03-02 11:00:00

我在 SQL 服务器中 PIVOT 之后

SELECT *
FROM (
    SELECT Id, DateTime, Status FROM table
) t
PIVOT (
    MAX(DateTime)
    FOR Status IN (Start, Stop1, Stop2, Finish)
) p

我得到了

Id Start Stop1 Stop2 Finish
2 2022-03-01 08:00:00 NULL NULL NULL
5 NULL NULL 2022-03-01 10:00:00 NULL
7 2022-03-01 14:00:00 NULL NULL NULL
1 NULL 2022-03-01 18:00:00 NULL NULL
3 NULL NULL 2022-03-01 20:00:00 NULL
6 NULL NULL NULL 2022-03-02 11:00:00
8 NULL 2022-03-02 10:00:00 NULL NULL
4 2022-03-02 09:00:00 NULL NULL NULL

我怎样才能得到那个时间表?

也许这会有所帮助。 window 功能可以是无价的

此外,请记住仅使用所需的列“喂养”您的数据透视表。

例子

Select *
 From  (
        Select id = min(case when Status='Start' then ID end) over (partition by Grp)
              ,DateTime
              ,Status 
         From (
                Select *
                      ,Grp = sum( case when [Status]='Start' then 1 else 0 end) over (order by datetime)
                from YourTable
              ) A
       ) src
 Pivot ( max(DateTime) FOR Status IN (Start, Stop1, Stop2, Finish) ) p

结果