MySQL SELECT выводит следующую дату на id в той же строке

У меня есть следующая структура таблицы, на которую я запрашиваю.

ID Date Before value After value
1 2014-04-25 Win Loss
1 2014-04-30 Loss Win
1 2014-08-18 Win Loss
1 2014-08-27 Loss Remise
1 2014-09-05 Remise Loss
2 2014-05-25 Win Remise
2 2014-06-07 Remise Win
2 2014-06-20 Win Loss

В качестве вывода моего оператора select я хочу получить следующий результат:

ID Start_Date End_Date After value
1 start 2014-04-25 Win
1 2014-04-26 2014-04-30 Loss
1 2014-05-01 2014-08-18 Win
1 2014-08-19 2014-08-27 Loss
1 2014-08-28 2014-09-05 Remise
1 2014-09-06 current Loss
2 start 2014-05-25 Win
2 2014-05-26 2014-06-07 Remise
2 2014-06-08 2014-06-20 Win
2 2014-06-21 current Loss

Конечно, в таблице есть 1000 записей, где нужно идти правильно. Я пробовал с ранжированием и присоединением, но пока не повезло. Если есть следующая строка, мне нужно как-то восстановить это значение в качестве начальной даты +1.

http://sqlfiddle.com/#!2/520b13/2

3 ответа

Что-то вроде:

select t1.id, (select max(date) + interval '1' day from the_table t2 where t2.date < t1.date and t2.id = t1.id) as start_date, t1.date as end_date, t1.after_value
from the_table t1
order by t1.id, t1.date;

SQLFiddle: http://sqlfiddle.com/#!2/8905a/3


В этом подходе используются встроенные переменные MySql для сохранения последнего идентификатора и последней даты для сравнения со следующей записью.

SELECT t.id, IF( @LastID = t.id, @LastDate, 'start ' ) as StartDate, IF( NOT t.date = t2.date, t.date, 'current ' ) as EndDate, t.after_value, @LastID := t.id as saveForNextLineID, @LastDate := t.date + INTERVAL 1 day as saveForNextDate from the_table t left join ( select id, max( date ) as date from the_table group by id ) t2 ON t.id = t2.id, (select @LastID := 0, @LastDate := 'start ' ) sqlvars order by t.id, t.date

Образец SQL Fiddle


Несколько прочитав несколько строк, но вы, возможно, сможете использовать UNION, чтобы вручную добавить дату начала и окончания, например:

select * from mytable
union
select DISTINCT ID,'2000-01-01' as 'Date','Before value',''After value' from mytable
union
select DISTINCT ID,NOW() as 'Date','Before value',''After value' from mytable

Попробуйте выставить это в подвыборке и запустить на нем свой код группировки.

licensed under cc by-sa 3.0 with attribution.