我有一個充滿事件的表。我被要求創建會話聚合表;一個會話可能有幾個事件。會話通過具有相同的到達時間來標識。例如(這是一種簡化,我不會打字實際時間戳):從一對多的關係中挑選一個
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
的問題是,如果兩個不同的工作人員都在列表中,則會話將出現兩次。有任何想法嗎?
我跟派生表一起去了,速度少了,因爲子查詢正在抱怨小組。 – Margaret 2011-01-28 05:44:15