2011-01-28 34 views
0

我有一個充滿事件的表。我被要求創建會話聚合表;一個會話可能有幾個事件。會話通過具有相同的到達時間來標識。例如(這是一種簡化,我不會打字實際時間戳):從一對多的關係中挑選一個

EventID ArrivalTime StartTime EndTime StaffID 
1  0945   0950  0955 John 
2  0945   0955  1000 Barb

可能變成類似:

ArrivalTime StartTime EndTime StaffID 
0945  0950  1000 ???

隨着使用MIN(StartTime)MAX(EndTime),以保持它的單行。

正如上面的問號所示,我遇到的問題是得到一個單一的員工ID--哪個員工不重要,但我需要某個人。如果它只是一個字符串,就像我上面顯示的那樣,它可以用MIN(StaffID)完成,但是我要做的事情是我需要在Staff表中查找StaffID並提取與之關聯的GUID與我的表中的短代碼。而且GUID不喜歡像MIN()這樣的函數。另外,更糟糕的是,事件表中的StaffID列是NULL,所以我必須堅持使用左連接或類似的。

有人提出了一個子查詢,但顯然我的大腦在星期五拒絕接受這個問題,並且看不到如何讓它工作。

爲基準,這裏是沿着我當前查詢的路線的東西:

SELECT NEWID() AS SessionID, 
e.ArrivalTime, 
MIN(e.StartTime), 
MAX(e.EndTime), 
s.StaffGUID 
FROM Events e LEFT JOIN Staff s ON e.StaffID = s.StaffID 
GROUP BY e.ArrivalTime, s.StaffGUID 

的問題是,如果兩個不同的工作人員都在列表中,則會話將出現兩次。有任何想法嗎?

回答

2

有(使用TOP 2000+)的相關子查詢的選項:

SELECT NEWID() AS SessionID, 
     e.ArrivalTime, 
     MIN(e.StartTime), 
     MAX(e.EndTime), 
     (SELECT TOP 1 s.StaffGUID 
      FROM STAFF s 
      WHERE s.staffid = e.staffid) AS staffguid 
    FROM EVENTS e 
GROUP BY e.arrivaltime, e.staffguid, staffguid 

...或(使用ROW_NUMBER 2005+)的派生表/內嵌視圖:

SELECT NEWID() AS SessionID, 
     e.ArrivalTime, 
     MIN(e.StartTime), 
     MAX(e.EndTime), 
     s.staffguid 
    FROM EVENTS e 
LEFT JOIN (SELECT t.staffid, 
        t.staffguid, 
        ROW_NUMBER() OVER (PARTITION BY t.staffid) AS rank 
      FROM STAFF t) s ON s.staffid = e.staffid 
          AND s.rank = 1 
GROUP BY e.arrivaltime, s.staffguid 

我優先考慮的是派生表 - 相關的子查詢往往不能很好地執行。

+0

我跟派生表一起去了,速度少了,因爲子查詢正在抱怨小組。 – Margaret 2011-01-28 05:44:15