我有一個包含一系列名稱,事件和日期的表格。我創建了一個與特定事件(evt5
)相關的新字段'evt5_date
'。如何使用'大於'和'group by'創建連接?
每個名稱可以有多個事件,每個事件的時間記錄在evt_date
字段中。 兩個事件evt1
和evt2
與evt5
有關。
我要插入evt5
第一次出現的日期到evt5
之前的所有evt1
和evt2
行。如果在evt1
或evt2
之後沒有evt5
,則該字段留空。
所有這些都必須爲每個name
完成。有幾千個不同的名字。沒有值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
我怎麼想它看起來 - - 我只是一直在下面的數據
當前表中的數據顯示 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 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之間的聯繫,同時還有groupin g,以獲得與最近的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');
誰是a2.evt5_date ???,我不明白這一點,你必須更新T1和集合A2 ? – jcho360
@ jcho360 - 對不起,這是一個錯字,它應該是't1'。現在修復。 –
你可以把一些結構和數據在sqlfiddle並分享它嗎? – jcho360