Mysql 圈间时间
我的SQL工作正常,除了第三个值上的1点,我需要上一次使用,这是表乘以模式、输出和SQL:Mysql 圈间时间,mysql,Mysql,我的SQL工作正常,除了第三个值上的1点,我需要上一次使用,这是表乘以模式、输出和SQL: id number time ----------------------------------- 1 9 00:00:10.000000 2 10 00:00:15.000000 3 9 00:00:22.000000 4 10 00:00:35.000000 1
id number time
-----------------------------------
1 9 00:00:10.000000
2 10 00:00:15.000000
3 9 00:00:22.000000
4 10 00:00:35.000000
1 9 00:00:55.000000
SELECT t.number, COUNT(1) laps,
GROUP_CONCAT(SEC_TO_TIME(time) ORDER BY t.id) times
FROM (
SELECT t1.id, t1.number,
TIME_TO_SEC(t1.time) - COALESCE(SUM(TIME_TO_SEC(t2.time)), 0) time
FROM times t1
LEFT JOIN times t2 ON t1.number = t2.number AND t2.id < t1.id
GROUP BY t1.id, t1.number, t1.time
) t
GROUP BY number
我需要这个预期的结果:
number laps times
-----------------------------------
9 3 00:00:10,00:00:12,00:00:33
10 2 00:00:15,00:00:20
其中,第三次-previos计算的时间,在本例中为00:00:10,00:00:12,00:00:23-00:00:12,我尝试将之前的所有时间相加
这有点棘手,但这里有一个解决方案: 主要问题是联接中的小于条件。因此,首先,你必须在你的分组中添加一个跑步号码排名。然后你就可以按这个级别加入了。结果查询有点大,但会提供所需的结果:
SELECT t.number, COUNT(1) laps,
GROUP_CONCAT(SEC_TO_TIME(time) ORDER BY t.id) times
FROM (
SELECT t1.id, t1.number,
TIME_TO_SEC(t1.time) - COALESCE(SUM(TIME_TO_SEC(t2.time)), 0) time
FROM
(SELECT
number, id, time,
(
CASE number
WHEN @curType
THEN @curRow := @curRow + 1
ELSE @curRow := 1 AND @curType := number END
) AS rank
FROM times, (SELECT @curRow := 0, @curType := '') r
ORDER BY number, id
) as t1
LEFT JOIN
(SELECT
number, id, time,
(
CASE number
WHEN @curType
THEN @curRow := @curRow + 1
ELSE @curRow := 1 AND @curType := number END
) AS rank
FROM times, (SELECT @curRow := 0, @curType := '') r
ORDER BY number, id
) t2
ON t1.number = t2.number and t2.rank+1 = t1.rank
GROUP BY t1.id, t1.number, t1.time
) t
GROUP BY number
给出:
| NUMBER | LAPS | TIMES |
|--------|------|----------------------------|
| 9 | 3 | 00:00:10,00:00:12,00:00:33 |
| 10 | 2 | 00:00:15,00:00:20 |
只需将总和更改为最大值
看
这是另一个没有内部分组的版本。它们的效果相同,但查询计划不同。因此,您可以选择比较性能
SELECT t.number, COUNT(1) laps,
GROUP_CONCAT(SEC_TO_TIME(time) ORDER BY t.time) times
FROM (
SELECT t1.id, t1.number, t1.time tm1,
(SELECT TIME_TO_SEC(t1.time) - COALESCE(MAX(TIME_TO_SEC(t2.time)),0)
FROM times t2
WHERE t1.number = t2.number AND t2.time < t1.time) AS time
FROM times t1
) t
GROUP BY number;
根据您的sql fiddle演示,最后一个id应该是5。
SELECT t.number, COUNT(1) laps,
GROUP_CONCAT(SEC_TO_TIME(time) ORDER BY t.id) times
FROM (
SELECT t1.id, t1.number,
TIME_TO_SEC(t1.time) - COALESCE(MAX(TIME_TO_SEC(t2.time)), 0) time
FROM times t1
LEFT JOIN times t2 ON t1.number = t2.number AND t2.time < t1.time -- Suggest you don't use id to compare
GROUP BY t1.id, t1.number, t1.time
) t
GROUP BY number
SELECT t.number, COUNT(1) laps,
GROUP_CONCAT(SEC_TO_TIME(time) ORDER BY t.time) times
FROM (
SELECT t1.id, t1.number, t1.time tm1,
(SELECT TIME_TO_SEC(t1.time) - COALESCE(MAX(TIME_TO_SEC(t2.time)),0)
FROM times t2
WHERE t1.number = t2.number AND t2.time < t1.time) AS time
FROM times t1
) t
GROUP BY number;