2011-12-16 19 views
0

SQLテーブルのヘルプが必要です。SQLクエリの問題

イベントID、PERSONID、イベントタイプ、イベント時刻(日時)、およびいくつかの他の下位カラム:

テーブルは、次の列を含んでいます。

2つの主要なイベントタイプは、ドアを開き、ドアを閉じることです。

私はドアを開けて、それを閉じたり、彼がドアを開けると別のものを開いて同じ人物間(秒)の持続時間を必要としています。(これはもちろん、単純にドアを開けるのシーケンスを可能にする)

だけに人1がドアを開け、人2がドアを閉じていれば、クエリーから返された行はないはずです。

私はそれが効率的であることを望みますが、それは必須ではありません。

EventID | PersonID | EventType | EventDate    | PreviousDoor | CurrentDoor 
    1 | 1  | 1  | 12/10/2010 12:00:01.024 |  0  |  23 
    2 | 1  | 2  | 12/10/2010 12:05:40.758 |  23  |  0 
    3 | 2  | 1  | 12/10/2010 12:12:05.347 |  0  |  12 
    4 | 1  | 1  | 12/10/2010 12:50:12.142 |  0  |  23 
    5 | 2  | 2  | 12/10/2010 13:00:06.468 |  12  |  23 
    6 | 3  | 1  | 13/10/2010 13:00:06.468 |  0  |  23 

イベントタイプ:1(オープンドア)、2(クローズドドア)

私は(SQLEXPRESS)ここで

2008 SQLマイクロソフトのサーバーを使用していますが、テーブルの一例です

結果は次のようになります。

EventID | PersonID | EventType | EventDate    | SecondsDifference 
    1 | 1  | 1  | 12/10/2010 12:00:01.024 | 339 
    3 | 2  | 1  | 12/10/2010 12:12:05.347 | 2881 

私は本当にあなたの男の助けを使用することができます。

ありがとうございます。

答えて

1

ROW_NUMBERPARTITIONヘルプを使用します:

SELECT   p1.EventID, 
        p1.PersonID, 
        p1.EventType, 
        p1.EventDate, 
        DATEDIFF(SECOND, p1.EventDate, p2.EventDate) AS SecondsDifference 
    FROM   [Event] p1 
    LEFT JOIN  [Event] p2 --Left join to self returning only closed door events 
    ON    p2.PersonID = p1.PersonID 
    AND    p2.EventType = 2 -- Closed Door 
    AND    p1.EventID < p2.EventID --We don't want to bring back events that happened before the next event 
    WHERE   p2.EventID IS NOT NULL --We don't want to show any people that have not closed a door 
1

私は、これはそれを行うべきだと思う:

select t1.EventID, t1.PersonID, t1.EventType, t1.EventDate, datediff(second, t1.EventDate, t2.EventDate) as 'SecondsDifference' 
from [Event] t1 
inner join [Event] t2 on t2.PersonID = t1.PersonID and t2.EventType = 2 and t2.PreviousDoor = t2.CurrentDoor and t2.EventID < t1.EventID 
where t1.EventType = 1 
+2

私はLEFTを回すと、内側に登録しよ示唆( 'p2.EventIDがNULL'冗長化されていない作り)に参加 - OPのみペアリングオープン/クローズイベントを望んでいる - と' WHERE p1.EventType = 1 'を追加します調子。 –

+1

@KevRitchieなぜLEFT JOIN?あなたはより良い結果を得るために 'CurrentDoor'と' PreviousDoor'を使う必要があります:) –

+1

@aF - GMTA。 :-) –

1

はこのような何かを試してみてください? 以下は正当なSQL文なのか分かりませんので、半疑似コードと見なしてください。

SELECT *, 
    ROW_NUMBER() OVER(PARTITION BY PersonID ORDER BY EventTime) AS RowNumber, 
    datediff(seconds, t2.EventTime, t1.EventTime) AS SecondsDiff 
FROM Events t1 
    INNER JOIN 
    SELECT *, 
     ROW_NUMBER() OVER(PARTITION BY PersonID ORDER BY EventTime) AS RowNumber 
    From Events t2 
    ON t1.RowNumber + 1 = t2.RowNumber 
    AND t1.PersonID = t2.PersonID AND t1.EventType = 1 
    AND (t2.EventType = 1 OR t2.EventType = 2) 
+0

質問が正しい結果を提供しているかどうかわかりませんが、2つのオープンドアイベントをペアにすることは可能です。また、ドア1を開いて閉じると、それをもう一度閉じると(全体的に4つのイベント)、最後のイベントと最初のイベントもペアになりませんか?(私は間違っているかもしれませんが、 – Jonathan