仅选择具有重复行的那些

问题描述 投票:1回答:2

我正在尝试找到具有相同fnumberfname的行

我可以使用此查询返回重复的那些但它只给出了重复项。我想要返回重复行和原始行。

WITH CTE AS(
   SELECT fnumber, findex,fname,
       RN = ROW_NUMBER()OVER(PARTITION BY fnumber ORDER BY fnumber)
   FROM dbo.coolTableBro
   where fnumber like '014%'
)
select * FROM CTE where RN > 1

查询输出:

fnumber findex  fname   RN
01474   220569  MT1     2
01475   220570  MT1     2
01476   220571  MT1     2
01477   220572  MT1     2
01478   220573  MT1     2
01479   220574  MT1     2
01480   220575  MT1     2
01481   220576  MT1     2

期望的输出:

fnumber findex  fname   RN
01474   220532  MT1     1
01474   220569  MT1     2
01475   220533  MT1     1
01475   220570  MT1     2
01476   220534  MT1     1
01476   220571  MT1     2
01477   220535  MT1     1
01477   220572  MT1     2
01478   220536  MT1     1
01478   220573  MT1     2
01479   220537  MT1     1
01479   220574  MT1     2
01480   220538  MT1     1
01480   220575  MT1     2
01481   220539  MT1     1
01481   220576  MT1     2

如果我更改where子句,我也会得到几行不重复的行。我需要像这样的伪语句,这显然不是有效的SQL

select fnumber,findex,fname from coolTableBro where fnumber and fname are the same in at least two rows and fnumber starts with 014

sql sql-server tsql
2个回答
2
投票

你可以使用COUNT

WITH CTE AS(
   SELECT fnumber, findex,fname,
       RN = ROW_NUMBER()OVER(PARTITION BY fnumber ORDER BY fnumber),
       CNT = COUNT(*) OVER (PARTITION BY fnumber)
   FROM dbo.coolTableBro
   where fnumber like '014%'
)
select * FROM CTE where CNT > 1;

0
投票

一种方法使用count(*)而不是row_number()

with cte as (
      select fnumber, findex, fname,
             count(*) over (partition by fnumber) as cnt
      from dbo.coolTableBro
      where fnumber like '014%'
)
select * 
from cte
where cnt > 1;

在性能方面,exists通常更好:

select tb.*
from dbo.coolTableBro tb
where tb.fnumber like '014%' and
      exists (select 1
              from dbo.coolTableBro tb2
              where tb2.fnumber = tb.fnumber and tb2.findex <> tb.findex
             );

如果你有(fnumber, findex)的索引,则尤其如此。

© www.soinside.com 2019 - 2024. All rights reserved.