计算响应时间
Calculating Response Times
在这个例子中,我们有一个包含各种事件的数据库,所有事件都存储在一个 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 语句解决方案让我逃脱了。
对于确实支持 window 函数的 MySql 版本,您可以使用自连接和聚合来获取最低和下一个时间戳,并使用 TIMESTAMPDIFF()
获取它们的区别:
SELECT t1.uuid,
TIMESTAMPDIFF(MINUTE, MIN(t1.stamp), MIN(t2.stamp)) diff
FROM tablename t1 LEFT JOIN tablename t2
ON t2.uuid = t1.uuid AND t1.stamp < t2.stamp
GROUP BY t1.uuid;
参见demo。
在这个例子中,我们有一个包含各种事件的数据库,所有事件都存储在一个 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 语句解决方案让我逃脱了。
对于确实支持 window 函数的 MySql 版本,您可以使用自连接和聚合来获取最低和下一个时间戳,并使用 TIMESTAMPDIFF()
获取它们的区别:
SELECT t1.uuid,
TIMESTAMPDIFF(MINUTE, MIN(t1.stamp), MIN(t2.stamp)) diff
FROM tablename t1 LEFT JOIN tablename t2
ON t2.uuid = t1.uuid AND t1.stamp < t2.stamp
GROUP BY t1.uuid;
参见demo。