在MYSQL中如何根据时间间隔将行转换为列
我有如下示例数据:在MYSQL中如何根据时间间隔将行转换为列,mysql,sql,Mysql,Sql,我有如下示例数据: ID Val Name Dt Status 1, 145, 'Test1', '2020-01-28 02:18:00', 'open' 2, 145, 'Test2', '2020-01-28 04:10:00', 'open' 3, 145, 'Test3', '2020-01-28 05:50:00', 'open'
ID Val Name Dt Status
1, 145, 'Test1', '2020-01-28 02:18:00', 'open'
2, 145, 'Test2', '2020-01-28 04:10:00', 'open'
3, 145, 'Test3', '2020-01-28 05:50:00', 'open'
4, 145, 'Test3', '2020-01-28 05:56:00', 'close'
5, 145, 'Test4', '2020-01-28 07:36:00', 'open'
6, 145, 'Test4', '2020-01-28 07:42:00', 'open'
7, 145, 'Test4', '2020-01-28 07:44:00', 'open'
8, 145, 'Test4', '2020-01-28 07:47:00', 'close'
如何获得如下输出:
ID Val Name Dt Status
1, 145, 'Test1', '2020-01-28 02:18:00', 'open'
2, 145, 'Test2', '2020-01-28 04:10:00', 'open'
3, 145, 'Test3', '2020-01-28 05:50:00', 'open'
4, 145, 'Test3', '2020-01-28 05:56:00', 'close'
5, 145, 'Test4', '2020-01-28 07:36:00', 'open'
6, 145, 'Test4', '2020-01-28 07:42:00', 'open'
7, 145, 'Test4', '2020-01-28 07:44:00', 'open'
8, 145, 'Test4', '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, 'Test2', '2020-01-28 04:10:00', 'open' NULL NULL
3, 145, 'Test3', '2020-01-28 05:50:00', 'open' '2020-01-28 05:56:00', 'close'
4, 145, 'Test4', '2020-01-28 07:36:00', 'open' '2020-01-28 07:47:00', 'close'
我尝试过不同的场景,但没有前进
使用
ID Val Name Dt Status
1, 145, 'Test1', '2020-01-28 02:18:00', 'open'
2, 145, 'Test2', '2020-01-28 04:10:00', 'open'
3, 145, 'Test3', '2020-01-28 05:50:00', 'open'
4, 145, 'Test3', '2020-01-28 05:56:00', 'close'
5, 145, 'Test4', '2020-01-28 07:36:00', 'open'
6, 145, 'Test4', '2020-01-28 07:42:00', 'open'
7, 145, 'Test4', '2020-01-28 07:44:00', 'open'
8, 145, 'Test4', '2020-01-28 07:47:00', 'close'
按dt排序的合并状态
ID Val Name Dt Status
1, 145, 'Test1', '2020-01-28 02:18:00', 'open'
2, 145, 'Test2', '2020-01-28 04:10:00', 'open'
3, 145, 'Test3', '2020-01-28 05:50:00', 'open'
4, 145, 'Test3', '2020-01-28 05:56:00', 'close'
5, 145, 'Test4', '2020-01-28 07:36:00', 'open'
6, 145, 'Test4', '2020-01-28 07:42:00', 'open'
7, 145, 'Test4', '2020-01-28 07:44:00', 'open'
8, 145, 'Test4', '2020-01-28 07:47:00', 'close'
没有得到确切的结果。有谁能对此提出建议吗
ID Val Name Dt Status
1, 145, 'Test1', '2020-01-28 02:18:00', 'open'
2, 145, 'Test2', '2020-01-28 04:10:00', 'open'
3, 145, 'Test3', '2020-01-28 05:50:00', 'open'
4, 145, 'Test3', '2020-01-28 05:56:00', 'close'
5, 145, 'Test4', '2020-01-28 07:36:00', 'open'
6, 145, 'Test4', '2020-01-28 07:42:00', 'open'
7, 145, 'Test4', '2020-01-28 07:44:00', 'open'
8, 145, 'Test4', '2020-01-28 07:47:00', 'close'
以前我问过相同数据集的问题,但现在要求改变了
ID Val Name Dt Status
1, 145, 'Test1', '2020-01-28 02:18:00', 'open'
2, 145, 'Test2', '2020-01-28 04:10:00', 'open'
3, 145, 'Test3', '2020-01-28 05:50:00', 'open'
4, 145, 'Test3', '2020-01-28 05:56:00', 'close'
5, 145, 'Test4', '2020-01-28 07:36:00', 'open'
6, 145, 'Test4', '2020-01-28 07:42:00', 'open'
7, 145, 'Test4', '2020-01-28 07:44:00', 'open'
8, 145, 'Test4', '2020-01-28 07:47:00', 'close'
链接:
一种方法使用滞后:
ID Val Name Dt Status
1, 145, 'Test1', '2020-01-28 02:18:00', 'open'
2, 145, 'Test2', '2020-01-28 04:10:00', 'open'
3, 145, 'Test3', '2020-01-28 05:50:00', 'open'
4, 145, 'Test3', '2020-01-28 05:56:00', 'close'
5, 145, 'Test4', '2020-01-28 07:36:00', 'open'
6, 145, 'Test4', '2020-01-28 07:42:00', 'open'
7, 145, 'Test4', '2020-01-28 07:44:00', 'open'
8, 145, 'Test4', '2020-01-28 07:47:00', 'close'
编辑:
ID Val Name Dt Status
1, 145, 'Test1', '2020-01-28 02:18:00', 'open'
2, 145, 'Test2', '2020-01-28 04:10:00', 'open'
3, 145, 'Test3', '2020-01-28 05:50:00', 'open'
4, 145, 'Test3', '2020-01-28 05:56:00', 'close'
5, 145, 'Test4', '2020-01-28 07:36:00', 'open'
6, 145, 'Test4', '2020-01-28 07:42:00', 'open'
7, 145, 'Test4', '2020-01-28 07:44:00', 'open'
8, 145, 'Test4', '2020-01-28 07:47:00', 'close'
调整后的数据
ID Val Name Dt Status
1, 145, 'Test1', '2020-01-28 02:18:00', 'open'
2, 145, 'Test2', '2020-01-28 04:10:00', 'open'
3, 145, 'Test3', '2020-01-28 05:50:00', 'open'
4, 145, 'Test3', '2020-01-28 05:56:00', 'close'
5, 145, 'Test4', '2020-01-28 07:36:00', 'open'
6, 145, 'Test4', '2020-01-28 07:42:00', 'open'
7, 145, 'Test4', '2020-01-28 07:44:00', 'open'
8, 145, 'Test4', '2020-01-28 07:47:00', 'close'
您可以只使用条件聚合:
ID Val Name Dt Status
1, 145, 'Test1', '2020-01-28 02:18:00', 'open'
2, 145, 'Test2', '2020-01-28 04:10:00', 'open'
3, 145, 'Test3', '2020-01-28 05:50:00', 'open'
4, 145, 'Test3', '2020-01-28 05:56:00', 'close'
5, 145, 'Test4', '2020-01-28 07:36:00', 'open'
6, 145, 'Test4', '2020-01-28 07:42:00', 'open'
7, 145, 'Test4', '2020-01-28 07:44:00', 'open'
8, 145, 'Test4', '2020-01-28 07:47:00', 'close'
select val, name,
min(case when status = 'open' then status end) as o_gate,
min(case when status = 'open' then dt end) as o_dt,
max(case when status = 'close' then status end) as c_gate,
max(case when status = 'close' then dt end) as c_dt,
from t
group by val, name;
他是一把小提琴
ID Val Name Dt Status
1, 145, 'Test1', '2020-01-28 02:18:00', 'open'
2, 145, 'Test2', '2020-01-28 04:10:00', 'open'
3, 145, 'Test3', '2020-01-28 05:50:00', 'open'
4, 145, 'Test3', '2020-01-28 05:56:00', 'close'
5, 145, 'Test4', '2020-01-28 07:36:00', 'open'
6, 145, 'Test4', '2020-01-28 07:42:00', 'open'
7, 145, 'Test4', '2020-01-28 07:44:00', 'open'
8, 145, 'Test4', '2020-01-28 07:47:00', 'close'
如果要重建id,可以使用以下表达式:
ID Val Name Dt Status
1, 145, 'Test1', '2020-01-28 02:18:00', 'open'
2, 145, 'Test2', '2020-01-28 04:10:00', 'open'
3, 145, 'Test3', '2020-01-28 05:50:00', 'open'
4, 145, 'Test3', '2020-01-28 05:56:00', 'close'
5, 145, 'Test4', '2020-01-28 07:36:00', 'open'
6, 145, 'Test4', '2020-01-28 07:42:00', 'open'
7, 145, 'Test4', '2020-01-28 07:44:00', 'open'
8, 145, 'Test4', '2020-01-28 07:47:00', 'close'
row_number() over (order by min(dt)) as id
但这一条不会给出打开日期和关闭日期@Gordon LinoffI已经尝试了条件聚合,但当我在select语句中添加其他列时,它不起作用。@mohan111。这回答了您在这里提出的问题。如果你有一个不同的问题,问一个新问题。对于相同的列,它本身没有给出确切的结果,它是在name@gordon上分组,它没有给出确切的结果result@mohan111 . . . 我加了一把小提琴。这将完全返回您指定的结果。你的问题已经回答了。如果你有一个不同的问题,把它当作一个新问题来问。结束约会的逻辑对我来说没有意义。原始数据中只有一行带有“close”(关闭),但不知何故您将其转换为两个关闭日期。抱歉@GordonLinoff我已修改了输入数据。请现在查看