回答

收藏

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

技术问答 技术问答 186 人阅读 | 0 人回复 | 2023-09-12

我想从 SQL Server 重复的项目选择在表中,但前提是 id 是连续的。
" h- G1 R+ n& m" v8 C6 S* o  t: C3 A我一直试图扭曲这个答案,但我不能让它工作。9 q# m# k7 _4 Z  e4 m
以上答案是针对的Oracle是的,但我看到了SQL Server也有lead和lag功能。4 h5 Z; o. q7 H2 o
此外,我认为上述答案是*重复项旁边有一个,但我只想选择重复项。. r) [) P7 Z4 M: k  H7 Z
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;示例:: W/ a7 m4 v# @, u, ^4 b6 e8 c
所以从这个数据集:
' A. J) X! `# _# Y# [7 f7 C& e$ [id      companyName-------------------                                              dogs ltd2        cats ltd3        pigs ltd4        pigs ltd5        cats ltd6        cats ltd7        dogs ltd8       pigs ltd我想选择:
$ C. S6 h2 g. `. J) J) ~5 k) |id      companyName-------------------     3                                                                                                                                                                                                                                                                                                                          pigs ltd4        pigs ltd5        cats ltd6        cats ltd更新6 X% _) Y5 l0 l3 r( }+ B% b
我时不时地在 SO 答案的数量和质量令人惊讶。这就是其中之一。我没有专业水平来判断一个答案比另一个好,所以我选择了 SqlZim,因为这是我看到的第一个有效的答案。但我很高兴看到不同的方法。尤其是一个小时前,我还在想,有可能吗?+ l' w) s' T- A$ @! L0 [$ d
                                                                8 m5 s4 E3 W- Y8 n
    解决方案:                                                                8 t+ A# W+ }: z( p- J' ?& ?  ]
                                                                这是一个间隙和岛屿风格的问题,但是row_numbers()我们在子查询中使用它id而不是两个row_number()count() over()获取计数 per grp,最后返回带有 a 的那些cnt > 1。0 |% j, J8 X: |  F
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  ) dwhere cnt  > 1order by idreextester 演示:http ://rextester.com/ACP73683% p2 r! o+ f  V, n* X( U3 P0 [" T2 [  o
返回:
& b6 l9 G3 G5 Z1 O* K+ I, r    ---- ------------- | id | companyname | ---- ------------- |  3 | pigs ltd    ||  4 | pigs ltd    ||  5 | cats ltd    ||  6 | cats ltd    | ---- -------------
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则