Mysql 圈间时间

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

我的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         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;