如何根据特定条件按SQL进行分组?

如何根据特定条件按SQL进行分组?,sql,sql-server,sql-server-2014,Sql,Sql Server,Sql Server 2014,我使用的是Microsoft SQL Server 2014,关于看电视的人,我有以下数据: 时间单位为午夜后几分钟 PersonId StartTime EndTime 1 300 600 1 250 700 1 200 800 1 900 1200 2 100 200 如您所见,我想要的是person 1的查看语句分组如下:

我使用的是Microsoft SQL Server 2014,关于看电视的人,我有以下数据:

时间单位为午夜后几分钟

PersonId   StartTime  EndTime
1          300        600
1          250        700
1          200        800
1          900        1200
2          100        200
如您所见,我想要的是person 1的查看语句分组如下:

250-700与300-600重叠,所以我想做的是从开始时间取最小值,从结束时间取最大值,因为它们重叠,我想对person 1的所有查看语句都这样做。但是我怎么能和一组人一起做呢

谢谢

缺口和孤岛

DECLARE @TVWatchingTime TABLE (PersonId int, StartTime int, EndTime int)
INSERT INTO @TVWatchingTime 
VALUES 
(1,          300,        600),
(1,          250,        700),
(1,          200,        800),
(1,          900,        1200),
(2,          100,        200)

;WITH cteSource(PersonId, StartTime, EndTime)
AS 
(
    SELECT
        s.PersonId, s.StartTime, e.EndTime
    FROM        
    (
        SELECT  PersonId, StartTime, ROW_NUMBER() OVER (ORDER BY StartTime) AS rn
        FROM    @TVWatchingTime
    ) AS s
    INNER JOIN 
    (
        SELECT  PersonId, EndTime, ROW_NUMBER() OVER (ORDER BY EndTime) + 1 AS rn
        FROM    @TVWatchingTime
    ) AS e ON s.PersonId = e.PersonId AND e.rn = s.rn
    WHERE s.StartTime > e.EndTime

    UNION ALL

    SELECT PersonId, MIN(StartTime), MAX(EndTime)
    FROM    @TVWatchingTime
    GROUP BY PersonId
), cteGrouped(PersonId, theTime, grp)
AS (
    SELECT  PersonId, u.theTime,
        (ROW_NUMBER() OVER (ORDER BY u.theTime) - 1) / 2
    FROM    cteSource AS s
    UNPIVOT (
            theTime
            FOR theColumn IN (s.StartTime, s.EndTime)
        ) AS u
)
SELECT PersonId, MIN(theTime) StartTime, MAX(theTime) EndTime
FROM cteGrouped
GROUP BY PersonId, grp
ORDER BY PersonId, grp
返回:

PersonId    StartTime   EndTime
1           200         800
1           900         1200
2           100         200
缺口和岛屿

DECLARE @TVWatchingTime TABLE (PersonId int, StartTime int, EndTime int)
INSERT INTO @TVWatchingTime 
VALUES 
(1,          300,        600),
(1,          250,        700),
(1,          200,        800),
(1,          900,        1200),
(2,          100,        200)

;WITH cteSource(PersonId, StartTime, EndTime)
AS 
(
    SELECT
        s.PersonId, s.StartTime, e.EndTime
    FROM        
    (
        SELECT  PersonId, StartTime, ROW_NUMBER() OVER (ORDER BY StartTime) AS rn
        FROM    @TVWatchingTime
    ) AS s
    INNER JOIN 
    (
        SELECT  PersonId, EndTime, ROW_NUMBER() OVER (ORDER BY EndTime) + 1 AS rn
        FROM    @TVWatchingTime
    ) AS e ON s.PersonId = e.PersonId AND e.rn = s.rn
    WHERE s.StartTime > e.EndTime

    UNION ALL

    SELECT PersonId, MIN(StartTime), MAX(EndTime)
    FROM    @TVWatchingTime
    GROUP BY PersonId
), cteGrouped(PersonId, theTime, grp)
AS (
    SELECT  PersonId, u.theTime,
        (ROW_NUMBER() OVER (ORDER BY u.theTime) - 1) / 2
    FROM    cteSource AS s
    UNPIVOT (
            theTime
            FOR theColumn IN (s.StartTime, s.EndTime)
        ) AS u
)
SELECT PersonId, MIN(theTime) StartTime, MAX(theTime) EndTime
FROM cteGrouped
GROUP BY PersonId, grp
ORDER BY PersonId, grp
返回:

PersonId    StartTime   EndTime
1           200         800
1           900         1200
2           100         200

请添加您的预期输出。这会很有帮助。结果应该是…?请添加您的预期输出。那会很有帮助。结果应该是。。。?