...数据差距和孤岛(SO 中有很多关于此的答案)
declare @t table(userid int, category char(1), datetimestart datetime);
insert into @t(userid, category, datetimestart)
values
(1, 'A', '20210212 08:10:02.000'),(1, 'A', '20210212 08:11:10.000'),
(1, 'B', '20210212 08:12:20.000'),(1, 'B', '20210212 08:14:30.000'),
(1, 'A', '20210212 08:15:20.000'),(1, 'A', '20210212 08:16:10.000'),(1, 'A', '20210212 08:18:40.000'),
(1, 'C', '20210212 08:19:05.000'),(1, 'C', '20210212 08:25:41.000'),
(2, 'A', '20210212 08:10:20.000'),(2, 'A', '20210212 08:14:10.000'),
(2, 'B', '20210212 08:29:05.000'),(2, 'B', '20210212 08:35:41.000'),
(2, 'A', '20210212 08:40:20.000'),(2, 'A', '20210212 08:44:10.000');
select
userid, category,
min(datetimestart) as startdatetime,
max(datetimestart) as enddatetime
from
(
select userid ,category,
case when lead(category) over(partition by userid order by datetimestart) = category
then datetimestart
else lead(datetimestart, 1, datetimestart) over(partition by userid order by datetimestart)
end as datetimestart,
row_number() over(partition by userid order by datetimestart)
-
row_number() over(partition by userid, category order by datetimestart) as groupid
from @t
) as t
group by userid, category, groupid
order by userid, startdatetime;