2015-02-27 2 views
0

У меня есть таблица действий и она содержит «начало» и (среди многих других) событий «конца».T-SQL Group/comb records

person, datetime, event 
1, 2015-01-1 13:30, start 
2, 2015-01-1 13:33, start 
3, 2015-01-1 13:38, start 
2, 2015-01-1 13:57, end 
1, 2015-01-1 14:03, end 
1, 2015-01-1 14:07, start 
1, 2015-01-1 14:12, end 

И я хочу, чтобы получить их что-то вроде этого:

person, start, end 
1, 2015-01-01 13:30, 2015-01-01 14:03 
1, 2015-01-01 14:07, 2015-01-01 14:12 
2, 2015-01-01 13:33, 2015-01-01 13:57 
3, 2015-01-01 13:38, null 

Я не могу показаться, чтобы получить ключевые слова вместе, чтобы найти такого рода «сочетает в себе ряды по» механику или подобным сценарию.

+0

типа Какие данные времена? –

+0

В какой базе данных вы работаете на mysql или SQL Server? – user2989408

+0

Извините, я понял, это был простой подзапрос top 1, я создал пример в T-SQL, но он также работает в MySQL с небольшими изменениями. –

ответ

1

без подзапроса

SELECT startevent.person_id as person, 
     startevent.datetime as [start], 
     min(endevent.datetime) as [end] 
    FROM person_events as startevent 
    join person_events as endevent 
    on startevent.person_id = endevent.person_id 
    and startevent.event = 'start' 
    and endevent.event = 'end' 
    and startevent.datetime < endevent.datetime 
GROUP BY startevent.person_id, startevent.datetime 
ORDER BY startevent.person_id, startevent.datetime 
0

Извините, решение было невероятно простым .. Я был слишком странным!

SELECT 
    startevent.person_id as person, 
    startevent.datetime as [start], 
    (
     SELECT TOP 1 
      endevent.datetime as [end] 
     FROM 
      person_events as endevent 
     WHERE 
      endevent.event = 'end' 
     AND 
      endevent.datetime >= startevent.datetime 
     ORDER BY 
      endevent.person_id, 
      endevent.datetime 
    ) as [end] 
FROM 
    person_events as startevent 
WHERE 
    event = 'start' 
ORDER BY 
    startevent.person_id, 
    startevent.datetime