【问题标题】:Duplicate in same row in different columns在不同列的同一行中重复
【发布时间】:2017-11-09 11:37:41
【问题描述】:

我有一张这样的桌子:

CREATE TABLE #my_table (
  intID int IDENTITY (1, 1),
  num_1 varchar(100) NOT NULL,
  num_2 varchar(100) NOT NULL,
  num_3 varchar(100) NOT NULL,
  num_4 varchar(100),
  num_5 varchar(100),
  isDuplicate char(1) DEFAULT 'N'
)

INSERT INTO #my_table (num_1, num_2, num_3, num_4, num_5)
  VALUES ('a', 'b', 'c', 'd', 'e')
INSERT INTO #my_table (num_1, num_2, num_3, num_4, num_5)
  VALUES ('a', 'b', 'c', 'd', 'e')
INSERT INTO #my_table (num_1, num_2, num_3, num_4, num_5)
  VALUES ('a', 'b', 'c', 'd', 'e')
INSERT INTO #my_table (num_1, num_2, num_3, num_4, num_5)
  VALUES ('a', 'b', 'a', 'd', 'e')
INSERT INTO #my_table (num_1, num_2, num_3, num_4, num_5)
  VALUES ('a', 'b', 'a', 'd', 'e')
INSERT INTO #my_table (num_1, num_2, num_3, num_4, num_5)
  VALUES ('a', 'b', 'c', 'd', 'c')

我需要在列中查找重复项并获取重复的行号。

我的结果应该是 重复行最后 3 行且重复标志应更新为 'Y'

【问题讨论】:

  • 你试过什么代码?
  • select * from ( select num_1, num_2, num_3, num_4, num_5 ,row_number() over (partition by num_1, num_2, num_3, num_4, num_5 order by intid desc) as rn from #my_table ) as dt where rn > 1 :但这会更新不应该的第 2 行和第 3 行
  • 请显示您想要的结果。您指定了两个不同的东西(查找重复项,将标志设置为 'Y')。
  • 请删除您的评论并点击“编辑”按钮将其添加到您的问题中。

标签: sql sql-server-2016


【解决方案1】:

这也可以解决问题:

UPDATE #my_table
    SET isDuplicate = 'Y'
WHERE intID IN (
    SELECT intID FROM #my_table
    WHERE EXISTS 
       (SELECT 1 
        FROM (VALUES 
                   (num_1)
                  ,(num_2)
                  ,(num_3)
                  ,(num_4)
                  ,(num_5)) AS X (n)
        WHERE NULLIF(n, '') IS NOT NULL
        GROUP BY n
    HAVING COUNT(*)>1
   )
)

有关表值构造函数的更多信息,您可以找到here

【讨论】:

  • 干得好..看起来很完美。+
  • 非常感谢 Valerica
【解决方案2】:

这应该可以解决问题:

select  num_1, num_2, num_3, count(*)
from #my_table
group by num_1, num_2, num_3
having count(*) > 1

问候

【讨论】:

  • 这会将最后一列设置为“Y”?
【解决方案3】:

这会将表中的重复列设置为“Y”,如果重复,您可以从中查询

UPDATE #my_table
SET isDuplicate = 'Y'
WHERE intID IN
(
    SELECT intID
    FROM
    (
        SELECT intID, num_1, num_2, num_3,num_4, num_5,
               RANK() OVER(PARTITION BY num_1, num_2, num_3, num_4, num_5 ORDER BY intID ASC) AS [rank]
        FROM #my_table
    ) a
    WHERE [rank] > 1
);

【讨论】:

    【解决方案4】:

    试试这个:

    UPDATE #my_table
    SET isDuplicate = 
    CASE
        WHEN
        (select count(*) 
        from #my_table t2
        where t2.intID <> #my_table.intID
        and t2.num_1 = #my_table.num_1
        and t2.num_2 = #my_table.num_2
        and t2.num_3 = #my_table.num_3
        and t2.num_4 = #my_table.num_4
        and t2.num_5 = #my_table.num_5
     ) > 0 then 'Y'
     ELSE 'N'
     END
    

    【讨论】:

      猜你喜欢
      • 2020-10-16
      • 2017-06-17
      • 1970-01-01
      • 2018-03-20
      • 1970-01-01
      • 2021-09-03
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多