У меня есть таблица 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 |
-----------------------------------------------------------------------
Если я правильно вас понял, просто используйте серию 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
Вы не можете динамически добавлять столбцы, поэтому вам нужно указать, что Time1 делает Time1, выражая это в выражении агрегатной функции в вашем предложении SELECT и т.д. Для всех значений, которые вы хотите, что, вероятно, не может быть выполнено, так как вы выражая отношение к другим значениям. MIN или MAX могут приблизиться, но "второе наименьшее" или "второе большинство" значений не может быть выражено, поскольку оно подразумевает отношение к другим значениям, агрегированным отдельно.
Вы можете рассмотреть GROUP_CONCAT, который, вероятно, ближе всего к тому, что вы хотите.
racerID
и поляsensor
БД должна иметь возможность их использовать. Как вы думаете, почему это не эффективно?