MySQL:一场比赛中跑步者的平均时间
也许我没有使用正确的词,但我没有找到搜索框的解决方案。 我和很多跑步者比赛。每个跑步者都跑了7/12圈。我有一项跑步记录。 例如:MySQL:一场比赛中跑步者的平均时间,mysql,time,average,period,Mysql,Time,Average,Period,也许我没有使用正确的词,但我没有找到搜索框的解决方案。 我和很多跑步者比赛。每个跑步者都跑了7/12圈。我有一项跑步记录。 例如: +------+-----------+---------------------+ | id. | id.runner | lapse time | +------+-----------+---------------------+ | 1 | 2 | 2019-12-16 09:24:10 | | 2 | 7
+------+-----------+---------------------+
| 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;
你能发布你到目前为止尝试过的查询吗?不可能:“#1064-你的SQL语法有错误;请检查与MySQL服务器版本对应的手册,以获得正确的语法,以便在第10行使用接近“OVER(按id划分运行程序顺序)),作为与表中的差异)t”。我在MySQL 5.1.73上运行,没有choice@user3726755试试我答案的第二个版本,它应该可以在你的MySQL版本上运行。很好!谢谢你的回复