小编典典

如何在 SQL Server 中选择连续的重复项

sql

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

我一直试图将这个答案扭曲到我的需要,但我无法让它发挥作用。

上面的答案是针对Oracle的,但是我看到SQL Server也有lead和lag功能。

另外,我认为上面的答案在*重复项旁边放了一个,但我只想选择重复项。

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;

示例:

所以从这个数据集:

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

我想选择:

id      companyName
-------------------    
3       pigs ltd
4       pigs ltd
5       cats ltd
6       cats ltd

更新
我时不时地对我在 SO 上得到的答案的数量和质量感到吃惊。这是其中之一。我没有专业水平来判断一个答案比另一个更好,所以我选择了 SqlZim,因为这是我看到的第一个有效答案。但是很高兴看到不同的方法。尤其是在一个小时前,我还在想“这可能吗?”。


阅读 268

收藏
2021-05-30

共1个答案

小编典典

这是一个间隙和岛屿风格的问题,但row_numbers()我们在最里面的子查询中使用id和代替了两个row_number()。其次是count() over()获取计数 per grp,最后返回带有 a 的那些cnt > 1。

select id, companyname 
from (
  select 
      id
    , companyName
    , grp
    , cnt = count(*) over (partition by companyname, grp)
  from (
    select *
      , grp = id - row_number() over (partition by companyname order by id)
    from
      companies
    ) islands
  ) d
where cnt  > 1
order by id

reextester 演示:http ://rextester.com/ACP73683

返回:

+----+-------------+
| id | companyname |
+----+-------------+
|  3 | pigs ltd    |
|  4 | pigs ltd    |
|  5 | cats ltd    |
|  6 | cats ltd    |
+----+-------------+
2021-05-30