2011-01-28 31 views
0

イベントがいっぱいのテーブルがあります。セッションの集計表を作成するように求められました。 1つのセッションに複数のイベントがある可能性があります。セッションは、同じ到着時間を有することによって識別される。例えば(これは、単純化である私は、実際のタイムスタンプを入力していないよ):単一の行にそれを維持するために1対1の関係から1つだけを選択

ArrivalTime StartTime EndTime StaffID 
0945  0950  1000 ???
MIN(StartTime)を使用することで

MAX(EndTime)

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

のようなものになっている可能性があります。

上記の疑問符が示すように、私が問題になっているのは、単一のスタッフIDを取得していることです。スタッフの人数はそれほど重要ではありませんが、誰かが必要です。上に示したように文字列だった場合はMIN(StaffID)で行うことができますが、私の頭の中にあるのは、StaffテーブルでStaffIDを検索し、関連するGUIDを引き出す必要があることです私のテーブルにある短いコードで。そして、GUIDはMIN()のような機能を好きではありません。また、事態を悪化させるためには、イベントテーブルのStaffID列がNULLであることが現実的です。そのため、左ジョイントなどを使用しなければなりません。

誰かがサブクエリを提案しましたが、明らかに私の脳は金曜日にこれを受け入れることを拒否し、それをどのように動作させるのか分かりません。問題は、2人の異なるスタッフがリストにある場合、セッションが二回表示されますということです

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

+0

私は、最初のものは、相関副選択のWHEREが '... WHERE s.staffid = MIN(e.staffid)'(またはMAX、それは関係ないので)のように変更されていればうまくいくと思います。 –

+0

@Andriy M:不要 - TOP 1は1レコードのみを返すようにします。 MINは同じものを返しません。 –

関連する問題