2012-06-18 63 views
5

我有一個包含一系列名稱,事件和日期的表格。我創建了一個與特定事件(evt5)相關的新字段'evt5_date'。如何使用'大於'和'group by'創建連接?

每個名稱可以有多個事件,每個事件的時間記錄在evt_date字段中。 兩個事件evt1evt2evt5有關。

我要插入evt5第一次出現的日期到evt5之前的所有evt1evt2行。如果在evt1evt2之後沒有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'); 
+0

誰是a2.evt5_date ???,我不明白這一點,你必須更新T1和集合A2 ? – jcho360

+0

@ jcho360 - 對不起,這是一個錯字,它應該是't1'。現在修復。 –

+0

你可以把一些結構和數據在sqlfiddle並分享它嗎? – jcho360

回答

4

我定你的更新語句的完整性,我覺得現在的工作。我省略了GROUP BY name部分,因爲它在你的版本中沒有意義。

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

+0

非常感謝這個和sqlfiddle的很好的解釋。我對一些不同的名稱進行了一些小改動(如更新後的問題所示)。我非常感謝幫助。 –