2010-10-28 38 views
0

我有表有點像跨越同桌獲取數據

Name  |DateOfEvent|EventType 
---------------------------------- 
Smith  |10/1/2005 |New 
Thomas |1/1/2002 |Updated 
Johnson |6/1/2002 |New 
Smith  |7/1/2008 |Updated 
Smith  |7/1/2000 |New 

我要回行,其中的事件是說新的,日期是相同名稱的行之前,但事件類型的更新,其中以後的日子。

我的想法是用名稱遍歷每一行的表,但看起來效率很低。有一個更好的方法嗎?

+0

不知道我理解你。鑑於上面的例子,預期的結果是什麼? – 2010-10-28 19:32:40

回答

3
CREATE TABLE #TEST 
(
    Name varchar(10), 
    DateOfEvent date, 
    EventType varchar(10) 
) 

INSERT INTO #TEST (Name, DateOfEvent, EventType) 
SELECT 'Smith',  '10/1/2005', 'New' UNION ALL 
SELECT 'Thomas', '1/1/2002', 'Updated' UNION ALL 
SELECT 'Johnson', '6/1/2002', 'New' UNION ALL 
SELECT 'Smith',  '7/1/2008', 'Updated' UNION ALL 
SELECT 'Smith',  '7/1/2000', 'New' 

SELECT NEW.* FROM 
    (SELECT Name, MAX(DateOfEvent) AS DateOfEvent 
     FROM #TEST 
     WHERE EventType = 'Updated' 
     GROUP BY Name 
    ) UPDATED 
    JOIN 
    (SELECT Name, MIN(DateOfEvent) AS DateOfEvent 
     FROM #TEST 
     WHERE EventType = 'New' 
     GROUP BY Name 
    )New ON New.DateOfEvent < UPDATED.DateOfEvent AND New.Name = UPDATED.Name 
+0

偉大的完整工作示例。 – Maestro1024 2010-10-28 19:55:17

3
SELECT 
    e1.* 
FROM 
    Events e1, 
    Events e2 
WHERE 
    e1.EventType = 'New' and 
    e1.Name = e2.Name and 
    e2.EventType = 'Updated' and 
    e2.DateOfEvent > e1.DateOfEvent; 

或以相同的加入:

SELECT 
    e1.* 
FROM 
    Events e1 
INNER JOIN 
    Events e2 
ON 
    e1.Name = e2.Name 
WHERE 
    e1.EventType = 'New' and 
    e2.EventType = 'Updated' and 
    e2.DateOfEvent > e1.DateOfEvent; 
+0

我想你已經把你的日期比較倒過來了。更新日期應該*晚於*新日期。 – 2010-10-28 19:34:33

+0

喬說什麼 - 目前它不起作用。 – 2010-10-28 19:35:41

+0

當然。修復答案。 – Kel 2010-10-28 19:37:56

1

也許沿着線的東西:

SELECT 
    t1.Name, 
    t1.DateOfEvent, 
    t1.EventType 
FROM table t1 
LEFT JOIN table t2 
    t1.Name = t2.Name 
WHERE 
t1.EventType = 'New' AND t1.DateOfEvent < t2.DateOfEvent AND t2.EventType = 'Updated' 

此查詢使用NameJOIN但名稱可能不會停留作爲唯一桌子增長。引入主鍵和父ID以跟蹤歷史記錄可能會更好。

+0

這是假設2個表嗎? t1和t2? – Maestro1024 2010-10-28 19:32:38

+1

@ Maestro1024:No. t1和t2是同一張表的別名。它被稱爲自連接。如果查看查詢,則會看到tablenime是相同的,即「table」。 – Saul 2010-10-28 19:37:57

+0

我明白了。謝謝您的幫助。 – Maestro1024 2010-10-28 20:03:41

1

用途:

SELECT x.name, 
     x.dateofevent, 
     x.eventtype 
    FROM YOUR_TABLE x 
WHERE x.eventtype = 'New' 
    AND EXISTS(SELECT NULL 
       FROM YOUR_TABLE y 
       WHERE y.name = x.name 
       AND y.eventtype = 'Updated' 
       AND y.dateofevent > x.dateofevent) 

與使用JOIN(內部或外部)的問題是,如果有一個以上的記錄之前的「新」標記爲「更新」與日期一個 - 將會有x引用的重複。