我有一个包含一系列名称,事件和日期的表格.我创建了一个与特定事件(evt5)相关的新字段’evt5_date’.
每个名称可以有多个事件,每个事件的时间记录在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的日期大于evt1和evt2的evt_date之间的链接,同时还通过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');
最佳答案
我修复了你的更新声明,我认为它现在有效.我省略了GROUP BY名称部分,因为它在您的版本中没有意义.
UPDATE mytable AS t1
INNER JOIN
(
SELECT
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
GROUP BY a.evt_date
) AS nearest_dates ON nearest_dates.evt_date = t1.evt_date
SET t1.evt5_date = nearest_dates.nearest_date
WHERE t1.event IN ('evt1','evt2');
首先进行一些验证:
http://sqlfiddle.com/#!2/309ac/6
最后的UPDATE查询:
http://sqlfiddle.com/#!2/80c3c/1