Вы можете дать ему попробовать:
SELECT
t.ID,
t.expectedTime,
t.usedMin
FROM
(
SELECT
ID,
IF(@currentDateTime <> DateTimeValue, @runningTime :='0000-00-00 00:00:00' , 1) resetting,
IF(@runningTime = '0000-00-00 00:00:00', DateTimeValue, @runningTime) AS expectedTime,
@minuteToAddNext := UsedMinutes AS usedMin,
@currentDateTime := DateTimeValue AS previousDateTime,
@runningTime := IF(@runningTime = '0000-00-00 00:00:00', DateTimeValue + INTERVAL UsedMinutes MINUTE , @runningTime + INTERVAL UsedMinutes MINUTE) AS nextRowsValue
FROM
datetimetable
CROSS JOIN (
SELECT
@currentDateTime := '0000-00-00 00:00:00',
@minuteToAddNext := 0,
@runningTime := '0000-00-00 00:00:00'
) AS var
ORDER BY DateTimeValue
) AS t;
WORKING DEMOвыходы 4 колонки (один дополнительный)
UPDATED WORKING DEMOвыходы 3 колонки, чтобы соответствовать ваше требование
Пояснение:
При сканировании каждой строки хранить значение UsedMinutes
в переменной под названием @minuteToAddNext
, как в запросе:
@minuteToAddNext := UsedMinutes
При сканировании следующей строки ваш f Первой задачей является добавление значения @minuteToAddNext
в DateTimeValue
, только если значение @minuteToAddNext
было сохранено от того же dateTimeValue
. Это переводится в запрос, как это:
DateTimeValue + INTERVAL IF(@currentDateTime = DateTimeValue, @minuteToAddNext , 0) MINUTE AS updatedDteTimeValue
Посмотрите, если предыдущий Роу @currentDateTime = current row's DateTimeValue
, то вы получите от @minuteToAddNext
IF
. (Одинаковые dateTimeValue
).
В противном случае IF
вернет 0
. Так, DateTimeValue + INTERVAL 0 MINUTE = DateTimeValue
EDIT:
Для того, чтобы обновить таблицу с теми сгенерированных datetime
значениями из приведенного выше запроса на выборку вам необходимо выполнить следующий запрос:
UPDATE datetimetable DT
INNER JOIN
(
SELECT
ID,
IF(@currentDateTime <> DateTimeValue, @runningTime :='0000-00-00 00:00:00' , 1) resetting,
IF(@runningTime = '0000-00-00 00:00:00', DateTimeValue, @runningTime) AS expectedTime,
@minuteToAddNext := UsedMinutes AS usedMin,
@currentDateTime := DateTimeValue AS previousDateTime,
@runningTime := IF(@runningTime = '0000-00-00 00:00:00', DateTimeValue + INTERVAL UsedMinutes MINUTE , @runningTime + INTERVAL UsedMinutes MINUTE) AS nextRowsValue
FROM
datetimetable
CROSS JOIN (
SELECT
@currentDateTime := '0000-00-00 00:00:00',
@minuteToAddNext := 0,
@runningTime := '0000-00-00 00:00:00'
) AS var
ORDER BY DateTimeValue
) AS t
ON DT.ID = t.ID
SET DT.DateTimeValue = t.expectedTime;
Почти идеально :) Но строка с ID 3 не получает ожидаемого значения из моего примера. Это нужно взять значение из ID 2 и добавить свои минуты. Любая идея, как это решить? –
Извините, я не заметил, что вы хотите получить суммарное значение времени для каждой даты. Исправлено сейчас. Пожалуйста, проверьте. @MartindeRuiter – 1000111
Выглядит хорошо! Вы знаете, как это можно сделать в запросе обновления, поэтому значения в таблице будут обновляться с новыми значениями datetime? –