多行的 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
结果
我有一个 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
结果