Sql 两个ROW_NUMBER()值之间,一个已分区,一个未分区 WITH t AS ( SELECT GroupName, StartingPoint, EndingPoint, ROW_NUMBER() OVER(PART
两个ROW_NUMBER()值之间,一个已分区,一个未分区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 )
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