2016-08-23 6 views
2

以下のデータが与えられた場合、どのようにして希望の結果を得ることができますか?1行結果で対応する行を取得しますか?

Timestamp | Session ID | Event | Name 
------------------------------------------ 
08:15  | 89   | Login | Scott 
08:16  | 89   | Edit | Scott 
08:16  | 92   | Login | John 
08:17  | 92   | Refresh | John 
08:23  | 89   | Logout | Scott 
08:28  | 92   | Logout | John 
08:30  | 96   | Login | Scott 
08:37  | 96   | Logout | Scott 

望ましい結果(セッション継続時間の本質的リスト):

Name | Login | Logout 
------------------------ 
Scott | 8:15 | 8:23 
John | 8:16 | 8:28 
Scott | 8:30 | 8:37 

編集:拡張サンプルデータと結果は、いくつかの混乱を避けるために。


私が実際に開発する必要があるクエリは、はるかに複雑です。私はちょうどこれが私に論理的なハードルの1つに良いジャンプスタートを与えると思った。

  1. :私は誰もが私が試したかを知ることになるでしょう知っているので、ここでは実際の構造からの私の現在、恥ずかしい、反復は...私はタックルしようとしている

    SELECT 
         SessionId, 
         SAMLData_Organization, 
         (Select TimeCreated FROM ens.messageheader h1,HS_Message.XMLMessage m1 WHERE h1.SessionId = h3.SessionId and m1.name = 'XDSB_QueryRequest') as RequestRecieved, 
         (Select TimeCreated FROM ens.messageheader h1,HS_Message.XMLMessage m1 WHERE h1.SessionId = h3.SessionId and m1.name = 'XDSB_QueryResponse') as ResponseSent 
    FROM 
         ens.messageheader h3,HS_Message.XMLMessage m3 
    WHERE SessionId IN (SELECT Distinct SessionId FROM ens.messageheader WHERE TimeCreated >= '2016-08-22 08' AND TimeCreated < '2016-08-22 17') 
    

    事ですENS.MessageHeaderHS_Message.XMLMessage

  2. タイプXDSb_QueryRequest
  3. のメッセージに対するTimeCreated値はを使用して対応するXDSb_QueryResponseためTimeCreated値をゲットしよう共通の値として。 Organization | RequestReceived | ResponseSent
+0

このシステムはPIVOT /ピボットテーブルをサポートしていますか? –

+0

私は見ることができません:http://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=GSQL –

+1

私はMSSQLによってとても甘やかされています:) –

答えて

2

ピュアLEFT SELFとして

  • 戻り結果は法

    SELECT 
        li.Name 
        ,li.Timestamp as Login 
        ,lo.Timestamp as LogOut 
    FROM 
        TableName li 
        LEFT JOIN TableName lo 
        ON li.[Session ID] = lo.[Session ID] 
        AND lo.Event = 'Logou' 
    WHERE 
        li.Event = 'Login' 
    

    LEFT SELFに参加することができますので、それはのSessionIdごとに制約ので、トップ1は良いですが集約

    SELECT 
        li.Name 
        ,li.Timestamp as Login 
        ,MIN(lo.Timestamp) as LogOut 
    FROM 
        TableName li 
        LEFT JOIN TableName lo 
        ON li.Name = lo.Name 
        AND lo.Timestamp > li.Timestamp 
        AND lo.Event = 'Logou' 
    WHERE 
        li.Event = 'Login' 
    GROUP BY 
        li.Name 
        ,li.Timestamp 
    

    で登録しようセッションごとの外観を参照してください。セッションIDが、あなたが探している名前とログイン/ログアウトのペアに対して一意でない場合、下端はうまく動作します。

    同様にこのように書かれることができるはずですあなたの答えパー

    SELECT 
        li.SAMLData_Organization, 
        li.SessionId, 
        m1.TimeCreated as RequestRecieved, 
        m2.TimeCreated as ResponseSent 
    FROM 
        ens.messageheader h1 
        INNER JOIN HS_Message.XMLMessage m1 
        ON h1.MessageBodyId = m1.id 
        and m1.name = 'XDSb_RetrieveRequest' 
        LEFT JOIN HS_Message.XMLMessage m2 
        ON h1.MessageBodyId = m2.id 
        and m2.name = 'XDSb_RetrieveResponse' 
    ORDER BY 
        h1.SessionId DESC 
    
  • +0

    @Scott私はコメントを見ていますあなたの質問を更新して物事をはっきりさせているが、自己結合メソッドを試してみたと答えている他の答えは? – Matt

    +0

    私はしていません。あなたの最近の編集まで混乱しました。私は今それを試してみましょう。 –

    +0

    ええ、私はいくつかの異なるメソッドをマージして何かを削除しました。私は誤って@Table変数をグループに残しました。私はまた、変数をTableNameに変更して、ごみをより明確にしました。私はSQL Serverのテーブル変数で書き込むものをテストします.... – Matt

    -2

    あなたは、このような何かを行うだけの作品にすべてを打破して、それらを一緒に置くことができ、私はあなたが持っていると仮定idカラム

    select distinct name, id, 
    
    (SELECT min(timestamp) from table 
    where event = "login" and user_id = event_table.user_id) as login, 
    
    (SELECT max (timestamp) from table 
    where event = "logout" and user_id = event_table.user_id) as logout 
    
    from event_table 
    

    はあなたが理解してほしい、これは、ここで私の実際のクエリMattの答えは@に基づいて

    +0

    ところで、私はオラクルのバックグラウンドから来ていますが、使用しているシステムにこれらの基本機能が必要です。 – Sobbles

    +0

    サンプルデータと結果を更新しました。 –

    +0

    Oracleと一緒に使用すると、パーティションのような分析機能が必要になります。使用しているシステムに精通していないのは残念です。 – Sobbles

    0

    を支援します。

    SELECT 
         li.SAMLData_Organization, 
         li.SessionId, 
         li.TimeCreated as RequestRecieved, 
         lo.TimeCreated as ResponseSent 
    FROM 
        (Select h1.SessionId, TimeCreated, SAMLData_Organization FROM ens.messageheader h1,HS_Message.XMLMessage m1 WHERE h1.MessageBodyId = m1.id and m1.name = 'XDSb_RetrieveRequest') li 
        LEFT JOIN (Select h2.SessionId, TimeCreated FROM ens.messageheader h2,HS_Message.XMLMessage m2 WHERE h2.MessageBodyId = m2.id and m2.name = 'XDSb_RetrieveResponse') lo 
        ON li.SessionId = lo.SessionId 
    GROUP BY li.SessionId 
    ORDER BY li.SessionId Desc 
    
    +1

    他にどのように書くことができるかについての私の更新された答えを見てください。 – Matt

    関連する問題