【问题标题】:Return id of row that has duplicate data返回具有重复数据的行的 id
【发布时间】:2017-02-03 05:56:00
【问题描述】:

我需要获取重复行的行 ID

Select Name from table1 group by Name having count(1) > 1

表1

ID | Name    | ClientID
----------------------------
01 | John    |  01
02 | Sam     |  01
03 | Sue     |  01
04 | John    |  02
05 | John    |  01

唯一的问题是它只会返回名称而不是列的 ID,因为我在同一张表上有多个客户端,我不想将其他客户端的名称计为重复。

那么有没有办法在表中查找重复数据并返回行的 ID,以便我可以在另一个查询中使用这些 ID?

回答我修改了

感谢大家提供的答案,这是我标记为答案的答案的修改。

select t1.*
from (select count(*) over (partition by entityname) as cnt ,t1.*
      from table1 t1 where ClientID = 1
     ) t1
where cnt > 1 and ClientID = 1 order by cnt;

【问题讨论】:

    标签: sql sql-server sql-server-2012 duplicates


    【解决方案1】:

    使用窗口函数:

    select t1.*
    from (select t1.*, count(*) over (partition by name) as cnt
          from table1 t1
         ) t1
    where cnt > 1;
    

    count(*) over (partition by name) 计算每个名称的行数。但是,它通过在每一行上附加计数来实现这一点,而不是通过减少行数。这就是选择行所需的信息。

    【讨论】:

    • 哇。好的,你能给我解释一下吗?这看起来像我想要使用的,但我不太明白那里发生了什么。谢谢。
    【解决方案2】:
    Select Name, min(ID) ROWID From table1 Group BY Name Having Count(ID)>1
    

    min(ID) 这里会返回ID第一次出现在重复中的时候,Count(ID)> 1 会过滤掉你有重复的行。

    祝你好运!

    【讨论】:

    • 所以这会给我每个重复的ID?
    • 它会告诉您名称第一次出现在列表中的时间。查询将为每个名称返回一行,行 id 列将包含该 ID 出现在原始文件中的 ID。
    • 太棒了!这正是我想要的。谢谢
    【解决方案3】:

    查看骗子的链接

    Declare @Yourtable table (ID varchar(25),Name varchar(50),Client_ID varchar(25)) 
    Insert into @Yourtable values 
    ('01','John','01'),
    ('02','Sam' ,'01'),
    ('03','Sue' ,'01'),
    ('04','John','02'),
    ('05','John','01')
    
    Select A.*
          ,B.Dupes 
     From  @YourTable A
     Cross Apply (Select Dupes=(Select Stuff((Select Distinct ',' + cast(ID as varchar(25)) 
                                  From @YourTable 
                                  Where ID<>A.ID and Name=A.Name
                                  For XML Path ('')),1,1,'')
                                )
                  ) B
     Where Dupes is not null
    

    返回

    ID  Name    Client_ID   Dupes
    01  John    01          04,05
    04  John    02          01,05
    05  John    01          01,04
    

    【讨论】:

      【解决方案4】:

      可以这样查询

      ;WITH cte_duplicates
      AS (SELECT
        id, name, client_id,
        ROW_NUMBER() OVER (PARTITION BY name ORDER BY id) AS rc
      FROM @Yourtable)
      SELECT
        id, name, client_id
      FROM cte_duplicates
      WHERE rc > 1
      

      【讨论】:

        【解决方案5】:

        如果您想根据名称和 ClientId 过滤出重复项,请使用以下查询。

         ; with cte_1
           as (select *, count(*) over (partition by name,client_id order by ID) as dups
          from table1  ) 
         Select *
         From cte_1
         where dups> 1;
        

        【讨论】:

          猜你喜欢
          • 2020-12-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-03
          • 2022-12-03
          • 2022-09-23
          • 2021-04-30
          • 2014-07-17
          相关资源
          最近更新 更多