2016-02-23 2 views
3

Я ищу, чтобы создать таблицу с одной датой, а затем следующую дату в наборе, учитывая некоторые критерии.Таблица с датой, затем следующей датой

необработанных данных:

id  date 
1  2000-01-01 
1  2000-01-02 
1  2000-01-04 
1  2000-01-10 
1  2000-01-14 
1  2000-01-15 
1  2000-01-16 
1  2000-01-18 
2  2000-02-01 
2  2000-02-02 
2  2000-02-04 
2  2000-02-10 
2  2000-02-14 
2  2000-02-15 
2  2000-02-16 
2  2000-02-18 

приведет ли:

id  date   date 
    1  2000-01-01 2000-01-02 
    1  2000-01-02 2000-01-04 
    1  2000-01-04 2000-01-10 
    1  2000-01-10 2000-01-14 
    1  2000-01-14 2000-01-15 
    1  2000-01-15 2000-01-16 
    1  2000-01-16 2000-01-18 
    1  2000-01-18 NULL 
    2  2000-02-01 2000-02-02 
    2  2000-02-02 2000-02-04 
    2  2000-02-04 2000-02-10 
    2  2000-02-10 2000-02-14 
    2  2000-02-14 2000-02-15 
    2  2000-02-15 2000-02-16 
    2  2000-02-16 2000-02-18 
    2  2000-02-18 NULL 

Я знаю, что я должен использовать сам присоединиться, но я не знаю, как вернуть последовательно следующий наибольшее значение, с учетом этого конкретного идентификатора. Благодарю.

ответ

1

В большинстве баз данных вы можете просто использовать функцию lead(). В MySQL, самый простой способ, вероятно, коррелированные подзапросы:

select t.*, 
     (select t2.date 
     from rawdata t2 
     where t2.id = t.id and t2.date > t.date 
     order by t2.date 
     limit 1 
     ) as next_date 
from rawdata t; 
+0

и заказать и ограничить подзапрос до 1 строки? add 'order by t2.date limit 1' Я думаю –

+0

Кажется, это возвращает только max из диапазона id, а не буквально только следующее значение самой высокой даты. –

+0

@TomKrakov. , , Это 'desc' должно было быть' asc'. –

0

Вы можете использовать [дата + интервал 1 день], если это MySQL или PostgreSQL DB

Например:

select t.id, t.date, t.date + interval 1 days as date 2 from rawdata t; 

Для оракула вы можете сделать что-то вроде этого:

select t.id , t.date, TO_DATE(t.date, 'YYYY-MM-DD') + 1 from rawdata t; 
+1

Разница в дате меняется, поэтому я не смог бы добавить стандартный 1 день. –

Смежные вопросы