2016-08-23 3 views
2

Учитывая следующие данные, как получить желаемый результат ниже?Получить соответствующие строки в результатах одной строки?

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 

редактирование: расширенные данные выборки и результаты, чтобы избежать некоторой путаницы.


Вопрос, который мне действительно нужен, намного сложнее. Я просто подумал, что это даст мне хороший прыжок на одном из логических препятствий. Так как я знаю, что все хотят знать, что я пытался, вот мой текущий, неловко, итерация от фактической структуры ...

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') 

Вещи, которые я пытаюсь решить:

  1. Регистрация ENS.MessageHeader и HS_Message.XMLMessage
  2. Получить значение TimeCreated для сообщений типа XDSb_QueryRequest
  3. Получить значение TimeCreated для соответствующего XDSb_QueryResponse с помощью SessionId в качестве общей стоимости.
  4. Возвращает результаты как Organization | RequestReceived | ResponseSent
+0

Поддерживает ли эта система таблицы PIVOT/pivot? –

+0

Не то, что я могу видеть: http://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=GSQL –

+1

Я настолько испорчен MSSQL :) –

ответ

2

Pure ЛЕВЫЙ автообъединение методу

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' 

ЛЕВЫЙ автообъединение с агрегацией

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 

Верхний один хорош тем, что он ограничивает в SESSIONID, так что вы можете см. каждый сеанс. Дно хорошо работает, если идентификатор сеанса не уникален для имени и пары входа/выхода, которую вы ищете.

За Ваш ответ он должен быть в состоянии быть написано, как это так:

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

Вы можете сделать что-то вроде этого, просто разбить все на куски, а затем положить их вместе, я предполагал, у вас есть идентификатор столбца

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 

Надеюсь, вы понимаете, и это помогает

+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

Смежные вопросы