Mysql time diff в группе по

0

У меня есть таблица times. Я хотел бы создать представление, которое даст мне первичный ключ и все разности времени для всех датчиков.

Датчики как паров:

 0.   start
 1-3. on track timers
 4.   end

Пример покажет лучшее:

Times table:
----------------------------------------------------------
| TimeID | RaceID | RacerID | Round | Sensor |    Time    |
-----------------------------------------------------------
|   1    |    1   |    1    |   1   |    0   |   100540   |
-----------------------------------------------------------
|   2    |    1   |    2    |   1   |    0   |   154297   |
-----------------------------------------------------------
|   3    |    1   |    1    |   1   |    1   |   170134   |
-----------------------------------------------------------
|   4    |    1   |    2    |   1   |    1   |   185915   |
-----------------------------------------------------------
|   5    |    1   |    1    |   1   |    2   |   200137   |
-----------------------------------------------------------
|   6    |    1   |    2    |   1   |    2   |   235103   |
-----------------------------------------------------------
|   7    |    1   |    1    |   1   |    4   |   380123   |
-----------------------------------------------------------
|   8    |    1   |    2    |   1   |    4   |   421127   |
-----------------------------------------------------------

Desired view
-----------------------------------------------------------------------
| TimeID | RaceID | RacerID | Round | Time1 | Time2 | Time3 |   Total |
-----------------------------------------------------------------------
|   1    |    1   |    1    |   1   | 69594 | 99597 |  null |  279583 |
-----------------------------------------------------------------------
|   1    |    1   |    2    |   1   | 31618 | 80806 |  null |  266830 |
-----------------------------------------------------------------------

http://sqlfiddle.com/#!9/10c5f/1

Теги:

2 ответа

1
Лучший ответ

Если я правильно вас понял, просто используйте серию left join s:

SELECT t0.timeID , t0.raceID, t0.racerID, t1.time - t0.time as 'Time 1',
t2.time - t1.time as 'Time 2', t3.time - t3.time as 'Time 3', t4.time - t0.time as 'Total'
FROM time t0 left join
time t1 on t0.racerID = t1.racerID and t1.sensor = 1 left join
time t2 on t0.racerID = t2.racerID and t2.sensor = 2 left join
time t3 on t0.racerID = t3.racerID and t3.sensor = 3 left join
time t4 on t0.racerID = t4.racerID and t4.sensor = 4 
where t0.sensor = 0
  • 0
    Это решение определенно работает, но эффективно ли оно? Я должен был бы проверить для raceID, racerID и round (думал, что смогу их проиндексировать)
  • 0
    Нет проблем с индексацией, если вы индексируете racerID и поля sensor БД должна иметь возможность их использовать. Как вы думаете, почему это не эффективно?
Показать ещё 1 комментарий
0

Вы не можете динамически добавлять столбцы, поэтому вам нужно указать, что Time1 делает Time1, выражая это в выражении агрегатной функции в вашем предложении SELECT и т.д. Для всех значений, которые вы хотите, что, вероятно, не может быть выполнено, так как вы выражая отношение к другим значениям. MIN или MAX могут приблизиться, но "второе наименьшее" или "второе большинство" значений не может быть выражено, поскольку оно подразумевает отношение к другим значениям, агрегированным отдельно.

Вы можете рассмотреть GROUP_CONCAT, который, вероятно, ближе всего к тому, что вы хотите.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню