MySQL : 跑者平均用时
MySQL : the average time of the runners of a race
也许我没有使用正确的词,但我没有通过搜索框找到解决方案。
我和很多赛跑者一起比赛。每个跑步者完成了 7/12 圈。我有一个跑步者圈数记录。
例如:
+------+-----------+---------------------+
| id. | id.runner | lapse time |
+------+-----------+---------------------+
| 1 | 2 | 2019-12-16 09:24:10 |
| 2 | 7 | 2019-12-16 09:24:20 |
| 3 | 4 | 2019-12-16 09:24:30 |
| 4 | 2 | 2019-12-16 09:25:10 |
| 5 | 7 | 2019-12-16 09:25:30 |
| 6 | 4 | 2019-12-16 09:25:50 |
| 7 | 2 | 2019-12-16 09:26:10 |
| 8 | 7 | 2019-12-16 09:26:40 |
| 9 | 4 | 2019-12-16 09:27:10 |
| 10 | 2 | 2019-12-16 09:27:10 |
+------+-----------+---------------------+
如果可能的话,我需要一个查询来获取跑步者的平均时间,这里:
2:60秒
7 : 70 秒
4 : 80 秒
还有一个用于获取平均时间的平均值,此处:
(60+70+80)/3 = 70
我尝试了很多查询,但结果总是错误的。
您可以使用 LEAD
和 TIMESTAMPDIFF
的组合来找出每对单圈时间,然后求出它们的差值:
SELECT
id_runner,
AVG(diff) AS avg_lap_time
FROM
(
SELECT
id_runner,
TIMESTAMPDIFF(SECOND,
lapse,
LEAD(lapse) OVER (PARTITION BY id_runner ORDER BY lapse)) AS diff
FROM yourTable
) t
GROUP BY
id_runner;
对于最后一圈时间,LEAD
将是 NULL
,因此整个差异计算也将是 NULL
。但是,这是可以接受的,因为那样它就会从平均计算中退出(即它会被忽略)。
请注意,如果您使用的 MySQL 的早期版本不支持 LEAD
,我们可以改为使用解析函数来查找下一个顺序单圈时间。
SELECT
id_runner,
AVG(diff) AS avg_lap_time
FROM
(
SELECT
id_runner,
TIMESTAMPDIFF(SECOND,
lapse,
(SELECT t2.lapse FROM yourTable t2
WHERE t2.id_runner = t1.id_runner AND t2.lapse > t1.lapse
ORDER BY t2.lapse LIMIT 1)) AS diff
FROM yourTable t1
) t
GROUP BY
id_runner;
也许我没有使用正确的词,但我没有通过搜索框找到解决方案。 我和很多赛跑者一起比赛。每个跑步者完成了 7/12 圈。我有一个跑步者圈数记录。 例如:
+------+-----------+---------------------+
| id. | id.runner | lapse time |
+------+-----------+---------------------+
| 1 | 2 | 2019-12-16 09:24:10 |
| 2 | 7 | 2019-12-16 09:24:20 |
| 3 | 4 | 2019-12-16 09:24:30 |
| 4 | 2 | 2019-12-16 09:25:10 |
| 5 | 7 | 2019-12-16 09:25:30 |
| 6 | 4 | 2019-12-16 09:25:50 |
| 7 | 2 | 2019-12-16 09:26:10 |
| 8 | 7 | 2019-12-16 09:26:40 |
| 9 | 4 | 2019-12-16 09:27:10 |
| 10 | 2 | 2019-12-16 09:27:10 |
+------+-----------+---------------------+
如果可能的话,我需要一个查询来获取跑步者的平均时间,这里: 2:60秒 7 : 70 秒 4 : 80 秒
还有一个用于获取平均时间的平均值,此处: (60+70+80)/3 = 70
我尝试了很多查询,但结果总是错误的。
您可以使用 LEAD
和 TIMESTAMPDIFF
的组合来找出每对单圈时间,然后求出它们的差值:
SELECT
id_runner,
AVG(diff) AS avg_lap_time
FROM
(
SELECT
id_runner,
TIMESTAMPDIFF(SECOND,
lapse,
LEAD(lapse) OVER (PARTITION BY id_runner ORDER BY lapse)) AS diff
FROM yourTable
) t
GROUP BY
id_runner;
对于最后一圈时间,LEAD
将是 NULL
,因此整个差异计算也将是 NULL
。但是,这是可以接受的,因为那样它就会从平均计算中退出(即它会被忽略)。
请注意,如果您使用的 MySQL 的早期版本不支持 LEAD
,我们可以改为使用解析函数来查找下一个顺序单圈时间。
SELECT
id_runner,
AVG(diff) AS avg_lap_time
FROM
(
SELECT
id_runner,
TIMESTAMPDIFF(SECOND,
lapse,
(SELECT t2.lapse FROM yourTable t2
WHERE t2.id_runner = t1.id_runner AND t2.lapse > t1.lapse
ORDER BY t2.lapse LIMIT 1)) AS diff
FROM yourTable t1
) t
GROUP BY
id_runner;