【发布时间】:2022-01-06 11:38:42
【问题描述】:
在本例中,我们有一个包含各种事件的数据库,所有事件都使用 uuid 存储。
我们的目标是计算 uuid 的初始时间戳和具有相同 uuid 的下一条记录的第一个时间戳之间的差异(以分钟为单位)。
目前,我们是在包含多个 SQL 语句的代码中手动执行此操作,由于高使用率会导致问题,因此我们开始缓存结果,但是,要求是实时的。
现在我正试图找出一种方法让数据库服务器在单个 SQL 语句中完成工作。
我尝试了各种加入结果的方法,但没有运气。可能有人知道一些模式魔法可以帮助我们解决这个问题。任何建议将不胜感激!
| uuid | stamp |
|---|---|
| 0df8-e817-050c-d0ce-06c0-53d6-8f99-c636 | 2021-11-29 15:39:52.000000 |
| 0df8-e817-050c-d0ce-06c0-53d6-8f99-c636 | 2021-11-29 15:33:43.000000 |
| 0df8-e817-050c-d0ce-06c0-53d6-8f99-c636 | 2021-11-29 15:32:26.000000 |
| 0a44-e1c3-efc9-6183-8afb-c39c-ee9d-7b75 | 2021-11-29 14:30:58.000000 |
| ffda-f1ee-ad99-1f9a-16e0-30e6-1ba8-9022 | 2021-11-23 22:00:50.000000 |
| ffda-f1ee-ad99-1f9a-16e0-30e6-1ba8-9022 | 2021-11-23 22:00:37.000000 |
| ffda-f1ee-ad99-1f9a-16e0-30e6-1ba8-9022 | 2021-11-23 21:51:30.000000 |
| fbcd-d8db-777e-f736-00db-f011-b239-2fb7 | 2021-11-23 19:43:06.000000 |
| fbcd-d8db-777e-f736-00db-f011-b239-2fb7 | 2021-11-23 19:26:52.000000 |
| fbcd-d8db-777e-f736-00db-f011-b239-2fb7 | 2021-11-23 19:24:30.000000 |
以0df8-e817-050c-d0ce-06c0-53d6-8f99-c636为例,最低时间戳为:
2021-11-29 15:32:26.000000
第一个后续时间戳是:
2021-11-29 15:39:52.000000
似乎很简单,可以在几分钟内获得差异......但是单个 SQL 语句解决方案让我无法理解。
【问题讨论】:
-
如果您使用的是更新版本的 MySQL,那么您可以使用
LEAD()获取下一个戳记,并使用TIMESTAMPDIFF()获取差异,留下::SELECT GUID, TIMESTAMPDIFF(MINUTE, Stamp, LEAD(Stamp) OVER(PARTITION BY Guid ORDER BY Stamp)) FROM YourTable -
不是 MAX(),而是相同 uuid 的第一行和第二行之间的分钟差(不过,谢谢)
-
2021-11-29 15:39:52.000000初始值如何?2021-11-29 15:33:43.000000小于那个。 -
Type-o,已修复! (谢谢)
-
我们使用的是 5.6,遗憾的是,没有 LEAD() 支持。那太棒了。
标签: mysql group-by min timestampdiff