У меня есть таблица, содержащая ряд имен, событий и дат. Я создал новое поле «evt5_date
», которое связано с конкретным событием (evt5
).
Каждое имя может иметь несколько событий, время каждого из которых записывается в поле evt_date
.
Два события evt1
и evt2
связаны с evt5
.
Я хочу вставить дату первого вхождения evt5
во все строки evt1
и evt2
, предшествующие evt5
. Если после evt1
или evt2
нет evt5
, то поле остается пустым.
Все это нужно проделать для каждого имени
. Есть несколько тысяч различных имён.В приведенных ниже данных я показал только 2
Текущие данные таблицы– нет значений в evt5_date
name evt_date event evt5_date
name-1 2010-06-30 evt1
name-1 2009-10-30 evt5
name-1 2009-09-30 evt2
name-1 2009-06-30 evt5
name-1 2009-03-30 evt5
name-1 2009-02-28 evt2
name-1 2009-01-30 evt1
name-2 2005-05-30 evt2
name-2 2005-03-30 evt5
name-2 2005-01-30 evt1
Как бы я хотел, чтобы это выглядело– значения в поле evt5_date
name evt_date event evt5_date
name-1 2010-06-30 evt1
name-1 2009-10-30 evt5
name-1 2009-09-30 evt2 2009-10-30
name-1 2009-06-30 evt5
name-1 2009-03-30 evt5
name-1 2009-02-28 evt2 2009-03-30
name-1 2009-01-30 evt1 2009-03-30
name-2 2005-05-30 evt2
name-2 2005-03-30 evt5
name-2 2005-01-30 evt1 2005-03-31
Я пытался выполнить обновление с кодом ниже, но я не знал, как указать связь между датой evt5, которая больше, чем evt_date evt1 и evt2, а также группировать по evt5, чтобы получить evt_date, относящийся к самому последнему evt5 .
Мне также нужно сгруппировать по имени, так как события специфичны для каждого имени.
update mytable as t1
set t1.evt5_date = (select min(t2.evt_date) from mytable as t2
where t2.event = 'evt5' AND
t2.evt_date > t1.evt_date
group by name)
where
t1.event in ('evt1', 'evt2')
Будем признательны за любые предложения. Спасибо
Обновление окончательного решения - некоторые незначительные изменения в ответе, предоставленном @biziclop, чтобы сохранить целостность имени
UPDATE mytable AS t1
INNER JOIN
(
SELECT
a.name, a.evt_date,
MIN( b.evt_date ) AS nearest_date
FROM mytable AS a
INNER JOIN mytable AS b ON b.event = 'evt5'
AND b.evt_date > a.evt_date
AND a.name = b.name -- needed this additional condition
GROUP BY a.name, a.evt_date -- added 'a.name' to 'group by'
) AS nearest_dates
ON nearest_dates.evt_date = t1.evt_date AND
nearest_dates.name = t1.name -- added this additional condition
SET t1.evt5_date = nearest_dates.nearest_date
WHERE t1.event IN ('evt1', 'evt2');