如何在SQL Server中选择顺序重复项

Mar*_*nox 2 sql t-sql sql-server gaps-and-islands

我想从SQL Server表中选择重复的条目,但前提是id是连续的.

我一直试图扭曲这个答案来满足我的需求,但我无法让它发挥作用.

以上答案是Oracle,但我看到的是SQL Server还具有leadlag功能.

此外,我认为上面的答案*是重复的,但我只想选择重复.

select 
    id, companyName, 
    case 
       when companyName in (prev, next) 
          then '*' 
    end match, 
    prev, 
    next 
from 
    (select
         id,
         companyName,
         lag(companyName, 1) over (order by id) prev,
         lead(companyName, 1) over (order by id) next
     from
         companies)
order by
    id;
Run Code Online (Sandbox Code Playgroud)

示例:

所以从这个数据集:

id      companyName
-------------------    
1       dogs ltd
2       cats ltd
3       pigs ltd
4       pigs ltd
5       cats ltd
6       cats ltd
7       dogs ltd
8       pigs ltd
Run Code Online (Sandbox Code Playgroud)

我想选择:

id      companyName
-------------------    
3       pigs ltd
4       pigs ltd
5       cats ltd
6       cats ltd
Run Code Online (Sandbox Code Playgroud)

更新

我一次又一次地对我得到的答案的数量和质量感到吃惊.这是其中一次.我没有专业水平来判断一个答案比另一个好,所以我去了SqlZim,因为这是我看到的第一个有效的答案.但是很高兴看到不同的方法.特别是在一个小时前,我想知道"这有可能吗?".

Gor*_*off 5

你非常接近你想要的:

select id, companyName
from (select c.*,
             lag(companyName, 1) over (order by id) prev,
             lead(companyName, 1) over (order by id) next
      from companies c
     ) a
where CompanyName in (prev, next)
order by id;
Run Code Online (Sandbox Code Playgroud)