T-SQLGroup/combine条记录
T-SQL Group/combine records
我有一个 activity table,它包含 'start' 和(以及许多其他)'end' 事件。
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
我似乎无法将关键字放在一起来找到这种 "combine rows by" 机制或类似场景。
对不起,解决方案非常简单..我把事情复杂化了!
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
没有子查询
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
我有一个 activity table,它包含 'start' 和(以及许多其他)'end' 事件。
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
我似乎无法将关键字放在一起来找到这种 "combine rows by" 机制或类似场景。
对不起,解决方案非常简单..我把事情复杂化了!
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
没有子查询
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