【问题标题】:How to get Start and End IDs of Continues data in Value column?如何在值列中获取连续数据的开始和结束 ID?
【发布时间】:2017-01-23 11:08:53
【问题描述】:

您好,我在下表中有以下数据:

我正在寻找下面的输出,

我正在使用 SQL Server 2008 R2。 我刚刚尝试使用 ID1 = ID2+1 和 Values not equal 条件自行加入表。

Select    T1.ID as ID1 ,T1.Value V1 ,T2.ID as ID2, T2.Value as V2 From [Test_Seq] T1 
                INNER Join [Test_Seq] T2 
                 on T2.ID = T1.ID+1  
                 Where T1.Value <>T2.Value

它给了我下面的输出,

我希望我能在这里得到更好的答案,并清楚地解释这种情况。

谢谢

【问题讨论】:

  • 发布您使用的查询。
  • 我在帖子中添加了查询。谢谢

标签: mysql sql sql-server sql-server-2008 oracle11g


【解决方案1】:

您可以尝试使用此查询

;with cte as (
select *, row_number() over(partition by value order by id) as rn1,  row_number() over(order by id) rn from #startend
) , cte2 as (
select min(id) startid, max(id) as endid, value, rn-rn1 as r from cte
group by rn-rn1, value
) select startid, endid, value from cte2
order by startid

【讨论】:

  • 这就是我要找的东西。我认为它可以通过递归查询来实现。非常感谢。有没有其他方法可以达到同样的效果?
  • 谢谢,虽然它不是递归查询..我认为我们可以使用 rank 和 dense_rank 以及窗口函数来实现这一点......我们可以尝试
【解决方案2】:
select min(id) as startid, max(id) as endid, value from (
 select id, value, id-row_number() over (partition by value order by id) as tmp from YourTableName
) T
 group by value, tmp
 order by 1

【讨论】: