Sql 两个ROW_NUMBER()值之间,一个已分区,一个未分区 WITH t AS ( SELECT GroupName, StartingPoint, EndingPoint, ROW_NUMBER() OVER(PART

Sql 两个ROW_NUMBER()值之间,一个已分区,一个未分区 WITH t AS ( SELECT GroupName, StartingPoint, EndingPoint, ROW_NUMBER() OVER(PART,sql,sql-server,sql-server-2008,gaps-and-islands,Sql,Sql Server,Sql Server 2008,Gaps And Islands,两个ROW_NUMBER()值之间,一个已分区,一个未分区 WITH t AS ( SELECT GroupName, StartingPoint, EndingPoint, ROW_NUMBER() OVER(PARTITION BY GroupName ORDER BY StartingPoint) - ROW_NUMBER() OVER(ORDER BY StartingPoint) AS SubGroupId FROM #test )

两个ROW_NUMBER()值之间,一个已分区,一个未分区

WITH t AS (
  SELECT
    GroupName,
    StartingPoint,
    EndingPoint,
    ROW_NUMBER() OVER(PARTITION BY GroupName ORDER BY StartingPoint)
      - ROW_NUMBER() OVER(ORDER BY StartingPoint) AS SubGroupId
  FROM #test
)
SELECT
  ROW_NUMBER() OVER (ORDER BY MIN(StartingPoint)) AS SortOrderId,
  GroupName                                       AS GroupName,
  MIN(StartingPoint)                              AS GroupStartingPoint,
  MAX(EndingPoint)                                AS GroupEndingPoint
FROM t
GROUP BY GroupName, SubGroupId
ORDER BY SortOrderId


从表格上看,除非我遗漏了什么,否则你可以使用
MIN
MAX
。从表格上看,除非我遗漏了什么,否则你可以使用
MIN
MAX
。从表格上看,除非我遗漏了什么,否则你可以使用
MIN
MAX
我遗漏了一些内容。从表中判断,除非我遗漏了一些内容,否则您可以使用
MIN
MAX
。谢谢您的帮助。我已经测试了这个查询,但是我无法根据我的要求进行调整。您的查询返回Grp1的07-10和Grp2的08-11,这意味着grps 2包含在grp1@Kiril . . . 它在每次比较中都包括
groupname
,包括最后的
groupby
。这是我所期望的,但是,我仍然得到了多个与同一日期段相关的组。我想,我的问题有点误解。本质上,我想要的是每次当前一行包含不同的GroupName时,都将该行标记为新组。此外,如果有一个新行包含与前一行中的任何一个完全相同的GroupName,则将其视为新组。谢谢您的帮助。我已经测试了这个查询,但是我无法根据我的要求进行调整。您的查询返回Grp1的07-10和Grp2的08-11,这意味着grps 2包含在grp1@Kiril . . . 它在每次比较中都包括
groupname
,包括最后的
groupby
。这是我所期望的,但是,我仍然得到了多个与同一日期段相关的组。我想,我的问题有点误解。本质上,我想要的是每次当前一行包含不同的GroupName时,都将该行标记为新组。此外,如果有一个新行包含与前一行中的任何一个完全相同的GroupName,则将其视为新组。谢谢您的帮助。我已经测试了这个查询,但是我无法根据我的要求进行调整。您的查询返回Grp1的07-10和Grp2的08-11,这意味着grps 2包含在grp1@Kiril . . . 它在每次比较中都包括
groupname
,包括最后的
groupby
。这是我所期望的,但是,我仍然得到了多个与同一日期段相关的组。我想,我的问题有点误解。本质上,我想要的是每次当前一行包含不同的GroupName时,都将该行标记为新组。此外,如果有一个新行包含与前一行中的任何一个完全相同的GroupName,则将其视为新组。谢谢您的帮助。我已经测试了这个查询,但是我无法根据我的要求进行调整。您的查询返回Grp1的07-10和Grp2的08-11,这意味着grps 2包含在grp1@Kiril . . . 它在每次比较中都包括
groupname
,包括最后的
groupby
。这是我所期望的,但是,我仍然得到了多个与同一日期段相关的组。我想,我的问题有点误解。本质上,我想要的是每次当前一行包含不同的GroupName时,都将该行标记为新组。此外,如果有一个新行包含与前一行中的任何一个完全相同的GroupName,则将其视为新组。
1  Grp1    |2014-01-06   |  2014-01-08  
2  Grp2    |2014-01-08   |  2014-01-09
3  Grp1    |2014-01-09   |  2014-01-10
4  Grp2    |2014-01-10   |  2014-01-11
;with cte as(
select *
, row_number() over (partition by GroupName order by startingpoint) as seq
from table1
)
select * 
into #temp2
from cte t1
left join cte t2 on t1.id=t2.id and t1.seq= t2.seq-1

select * 
,(select startingPoint from #temp2 t2 where t1.id=t2.id and t2.seq= (select MIN(seq) from #temp2) as Oldest
(select startingPoint from #temp2 t2 where t1.id=t2.id and t2.seq= (select MAX(seq) from #temp2) as MostRecent
from #temp2 t1
SELECT DISTINCT 
    GroupName, 
    MIN(StartingPoint) OVER (PARTITION BY GroupName ORDER BY Id), 
    MAX(EndingPoint) OVER (PARTITION BY GroupName ORDER BY Id)
FROM table1
with table1_flag as (
      select t1.*,
             isnull((select top 1 1
                     from table1 t2
                     where t2.groupname = t1.groupname and
                           t2.endingpoint = t1.startingpoint
                    ), 0) as groupstartflag
      from table1 t1
     ),
     table1_flag_cum as (
      select tf.*,
             (select sum(groupstartflag)
              from table1_flag tf2
              where tf2.groupname = tf.groupname and
                    tf2.startingpoint <= tf.startingpoint
             ) as groupnum
      from table1_flag tf
     )
select groupnum, groupname,
       min(startingpoint) as startingpoint, max(endingpoint) as endingpoint
from table1_flag_cum
group by groupnum, groupname;
WITH t AS (
  SELECT
    GroupName,
    StartingPoint,
    EndingPoint,
    ROW_NUMBER() OVER(PARTITION BY GroupName ORDER BY StartingPoint)
      - ROW_NUMBER() OVER(ORDER BY StartingPoint) AS SubGroupId
  FROM #test
)
SELECT
  ROW_NUMBER() OVER (ORDER BY MIN(StartingPoint)) AS SortOrderId,
  GroupName                                       AS GroupName,
  MIN(StartingPoint)                              AS GroupStartingPoint,
  MAX(EndingPoint)                                AS GroupEndingPoint
FROM t
GROUP BY GroupName, SubGroupId
ORDER BY SortOrderId