分组依据和计数选择重复的行

时间:2015-11-10 12:01:49

标签: sql sql-server

我写了这个查询,但它没有按照我的预期工作。

第一个目标:选择在某些列中重复并返回整列的行。

第二个目标:更新标志(一列)以确定哪些记录已重复。

你能帮我吗?

SELECT
  *
FROM AvvalV2NS AS M
WHERE EXISTS 

(SELECT
  M.Astate,
  M.Acity,
  M.Azone,
  M.Abvillage,
  M.Avillage,
  COUNT(*)
FROM AvvalV2NS AS M
GROUP BY M.Astate,
         M.Acity,
         M.Azone,
         M.Abvillage,
         M.Avillage
HAVING COUNT(*) > 1)

2 个答案:

答案 0 :(得分:1)

如果要获取重复的行,窗口函数可能是最简单的方法:

select a.*
from (select a.*,
             count(*) over (partition by M.Astate, M.Acity,  M.Azone, M.Abvillage, M.Avillage) as cnt
      from AvvalV2NS a
     ) a
where cnt > 1;

您可以通过执行以下操作来更新标记:

with toupdate as (
      select a.*
      from (select a.*,
                   count(*) over (partition by M.Astate, M.Acity,  M.Azone, M.Abvillage, M.Avillage) as cnt
            from AvvalV2NS a
           ) a
     )
update toupdate
    set isduplicate = (case when cnt > 1 then 1 else 0 end);

答案 1 :(得分:0)

假设您的表有一个id列:

SELECT * FROM THE_TABLE WHERE ID IN (
    SELECT ID FROM 
    (SELECT ID, REPEATING_COLUMNS, COUNT(*) FROM THE_TABLE GROUP BY REPEATING_COLUMNS HAVING COUNT(*) > 1)
)

UPDATE THE_TABLE SET THE_FLAG = "HERE WE GO" WHERE ID IN (
    SELECT ID FROM 
    (SELECT ID, REPEATING_COLUMNS, COUNT(*) FROM THE_TABLE GROUP BY REPEATING_COLUMNS HAVING COUNT(*) > 1)
)

希望这有帮助。