我想从 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,因为这是我看到的第一个有效答案。但是很高兴看到不同的方法。尤其是在一个小时前,我还在想“这可能吗?”。
这是一个间隙和岛屿风格的问题,但row_numbers()我们在最里面的子查询中使用id和代替了两个row_number()。其次是count() over()获取计数 per grp,最后返回带有 a 的那些cnt > 1。
row_numbers()
row_number()
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 | +----+-------------+