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

我尝试了很多查询,但结果总是错误的。

您可以使用 LEADTIMESTAMPDIFF 的组合来找出每对单圈时间,然后求出它们的差值:

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;

Demo

对于最后一圈时间,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;