如何在MYSQL中获得打开和关闭时间段

问题描述 投票:0回答:2

我有这样的示例数据:

    ID Val   Name        Dt                 Status
    1, 145, 'Test1', '2020-01-28 02:18:00', 'open'
    2, 145, 'Test1', '2020-01-28 04:10:00', 'open'
    3, 145, 'Test1', '2020-01-28 05:50:00', 'open'
    4, 145, 'Test1', '2020-01-28 05:56:00', 'close'
    5, 145, 'Test2', '2020-01-28 07:36:00', 'open'
    6, 145, 'Test2', '2020-01-28 07:42:00', 'open'
    7, 145, 'Test2', '2020-01-28 07:44:00', 'open'
    8, 145, 'Test2', '2020-01-28 07:47:00', 'close'

我如何获得这样的输出:

ID Val   Name        o_Dt                 o_gate      c_Dt             c_gate
1, 145, 'Test1', '2020-01-28 02:18:00', 'open'        NULL               NULL
2, 145, 'Test1', '2020-01-28 04:10:00', 'open'        NULL               NULL
3, 145, 'Test1', '2020-01-28 05:50:00', 'open'  '2020-01-28 05:56:00', 'close'
4, 145, 'Test2', '2020-01-28 07:36:00', 'open'        NULL               NULL
5, 145, 'Test2', '2020-01-28 07:42:00', 'open'        NULL               NULL
6, 145, 'Test2', '2020-01-28 07:44:00', 'open'  '2020-01-28 07:47:00', 'close'

我尝试过不同的情况,但没有继续使用

COALESCE(LAG(Status)OVER(按dt排序)] >>

ROW_NUMBER()OVER(PARTITION BY vehicle_id,status)

没有得到确切的结果。任何人都可以对此提出建议。

以前我曾问过相同数据的问题,但没有确切答案。

How to transpose rows to columns based on time intervals in MYSQL

我有这样的示例数据:ID Val Name Dt Status 1,145,'Test1','2020-01-28 02:18:00','open'2,145,'Test1','2020-01 -28 04:10:00','open'3,145,'...

mysql sql
2个回答
1
投票
SELECT t1.ID, t1.Val, t1.Name, t1.Dt o_Dt, t1.Status o_gate, t2.Dt c_Dt, t2.Status c_gate
FROM test t1
LEFT JOIN test t2 ON t1.Dt < t2.Dt
                 AND t1.Name = t2.Name
                 AND t2.Status = 'close'
                 AND NOT EXISTS ( SELECT NULL
                                  FROM test t3
                                  WHERE t1.Dt < t3.Dt
                                    AND t3.Dt < t2.Dt
                                    AND t1.Name = t3.Name)
WHERE t1.Status = 'open'

0
投票

请尝试以下代码

© www.soinside.com 2019 - 2024. All rights reserved.