Как создать объединение, используя операторы «больше чем» и «группировать по»?

У меня есть таблица, содержащая ряд имен, событий и дат. Я создал новое поле «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');
5
задан getting-there 19 June 2012 в 05:56
поделиться