我有一张包含一系列名称、事件和日期的表格。我创建了一个新字段'
每个名称可以有多个事件,每个事件的时间记录在
我想将第一次出现
所有这些都必须针对每个
我尝试使用以下代码进行更新,但我不知道如何指定evt5的日期大于evt1和evt2的evt_date之间的关联,并按evt5分组以获取与最新evt5相关的evt_date。
由于事件针对每个名称,因此我还需要按名称分组。
evt5_date
',它与特定事件(evt5
)相关联。每个名称可以有多个事件,每个事件的时间记录在
evt_date
字段中。两个事件evt1
和evt2
与evt5
相关。我想将第一次出现
evt5
的日期插入到所有evt1
和evt2
行之前。如果在evt1
或evt2
之后没有evt5
,则该字段将保留为空。所有这些都必须针对每个
name
完成。有几千个不同的名称。下面的数据中只显示了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分组以获取与最新evt5相关的evt_date。
由于事件针对每个名称,因此我还需要按名称分组。
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提供的答案进行了一些小修改,以保持name
的完整性。
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');