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

发布于 2025-01-11 20:39:07 字数 2491 浏览 3 评论 0原文

我有一个表,其值不按顺序排列

IdDateTimeStatus
12022-03-01 18:00:00.000Stop1
22022-03-01 08:00:00.000Start
32022-03-01 20:00:00.000Stop2
42022-03-02 09:00:00.000开始
52022-03-01 10:00:00.000停止
2 62022-03-02 11:00:00.000结束
72022-03-01 14:00:00.000开始
82022-03-02 10:00:00.000Stop1

,其中 Status 可以是“Start”、“Stop1”、“Stop2”或“Finish”。

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

IdStartStop1Stop2Finish
22022-03-01 08:00:00NULL2022- 03-01 10:00:00
72022-03-01 14:00:002022-03-01 18:00:002022-03-01 20:00:00
42022-03-02 09:00:002022-03-02 10:00:002022-03-02 11: 00:00

在我在 SQL Server 中进行 PIVOTed 后,

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

我得到了

ID开始Stop1Stop2完成
22022-03-01 08:00:00NULLNULLNULL
5NULLNULL2022-03-01 10:00:00NULL
72022-03-01 14:00:00NULLNULLNULL
1NULL2022 -03-01 18:00:00NULL
3NULLNULL2022-03-01 20:00:00NULL
6NULLNULLNULL2022-03-02 11:00:00
8NULL2022-03-02 10:00:00NULLNULL
42022-03-02 09 :00:00NULLNULLNULL

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

I have a table with values which are not in order

IdDateTimeStatus
12022-03-01 18:00:00.000Stop1
22022-03-01 08:00:00.000Start
32022-03-01 20:00:00.000Stop2
42022-03-02 09:00:00.000Start
52022-03-01 10:00:00.000Stop2
62022-03-02 11:00:00.000Finish
72022-03-01 14:00:00.000Start
82022-03-02 10:00:00.000Stop1

where Status can be 'Start', 'Stop1', 'Stop2', or 'Finish'.

I need the timeline like this, where the values are pivoted in the order (from the earliest to the latest; id is not relevant at this point)

IdStartStop1Stop2Finish
22022-03-01 08:00:00NULL2022-03-01 10:00:00NULL
72022-03-01 14:00:002022-03-01 18:00:002022-03-01 20:00:00NULL
42022-03-02 09:00:002022-03-02 10:00:00NULL2022-03-02 11:00:00

After I PIVOTed it in SQL Server

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

I got

IdStartStop1Stop2Finish
22022-03-01 08:00:00NULLNULLNULL
5NULLNULL2022-03-01 10:00:00NULL
72022-03-01 14:00:00NULLNULLNULL
1NULL2022-03-01 18:00:00NULLNULL
3NULLNULL2022-03-01 20:00:00NULL
6NULLNULLNULL2022-03-02 11:00:00
8NULL2022-03-02 10:00:00NULLNULL
42022-03-02 09:00:00NULLNULLNULL

How can I get that timeline?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

逆夏时光 2025-01-18 20:39:07

也许这会有所帮助。窗口函数的价值是无价的,

此外,请记住仅使用所需的列来“馈送”数据透视表。

示例

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

结果

在此处输入图像描述

Perhaps this will help. The window functions can be invaluable

Also, remember to "FEED" your pivot with only the required columns.

Example

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

Results

enter image description here

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文