【发布时间】:2020-09-16 20:19:05
【问题描述】:
我有一张这样的桌子:
Person smallint(5) act_time datetime
1 2020-05-29 07:00:00
1 2020-05-29 07:15:00
1 2020-05-29 07:30:00
2 2020-05-29 07:15:00
2 2020-05-29 07:30:00
1 2020-05-29 10:30:00
1 2020-05-29 10:45:00
上面的表格是一个有 2 个不同的人的例子,他们工作的每个季度都有一行...
在 MySQL 中,将此表“转换”为另一个表的最佳方法是什么,其中有一列用于“人”,一列用于“开始”,一列用于“停止”。
所以结果是这样的:
Person Start Stop
1 2020-05-29 07:00:00 2020-05-29 07:45:00
2 2020-05-29 07:15:00 2020-05-29 07:45:00
1 2020-05-29 10:30:00 2020-05-29 11:00:00
我曾尝试对同一个原始表进行左连接,但没有成功...
谢谢。
感谢您的回复。我现在已经用上面的表格尝试过了——不幸的是它没有给出那个结果...... 我的 sql 字符串是:
select person,min(act_time) start_date,max(act_time) end_date from (select t.*,row_number() over(order by act_time) rn1,row_number() over(partition by person order by act_time) rn2 from test t) t group by person, rn1 - rn2 order by min(act_time)
But the result it generates is:
1 29-05-2020 07:00:00 29-05-2020 07:15:00
2 29-05-2020 07:15:00 29-05-2020 07:15:00
1 29-05-2020 07:30:00 29-05-2020 07:30:00
2 29-05-2020 07:30:00 29-05-2020 07:30:00
1 29-05-2020 10:30:00 29-05-2020 10:45:00
它应该像 3 行的结果。因此,当同一个人的行之间的间隔超过 15 分钟时,它应该创建一个新行。
【问题讨论】:
-
虽然我们可能不会提供“最佳”方式,但如果您提供适当的 DDL,也许我们可以向您展示“一种”方式。见Why should I provide an MCRE for what seems to me to be a very simple SQL query
标签: mysql sql date window-functions gaps-and-islands