在sql中基于两个分组删除重复数据

时间:2014-01-28 13:17:22

标签: sql sql-server

您好我有一个有一些重复数据的Sql表

id  T_PSProjectId   T_CodePattern   T_NCR
1   0000130586  3MEXCM  NULL
2   0000131771  3MEXTPS NULL
3   0000131771  3MEXTPS 123456
4   0000130586  3MRA    NULL
5   0000130586  3MRAS   NULL
6   0000130586  3MT1    NULL
7   0000130586  3MT1    555
8   0000131176  3MT1    NULL
9   0000131190  3MT1    NULL
10  0000130584  3MT1    NULL
11  0000130584  3MT1    333000
12  0000130584  3MT1S   NULL
13  0000131755  3MT1S   NULL
14  0000130586  3MT1S   NULL
15  0000130586  3MT1S   550000
16  0000129495  3TMEU   NULL
17  0000131186  3TTHS   NULL
18  0000130583  3UA1P   NULL
19  0000130584  3UEXCESC    NULL
20  0000130584  3UEXCESCS   NULL
21  0000130583  3UEXCI  NULL
22  0000130583  3UEXCIS NULL

如您所见,第3行和第4行的列T_codepattern具有相同的值 所以我想删除那些具有重复的T_PSProjectId + T_CodePattern组合并且具有T_NCR空值的行

例如:从第2行和第3行..它应该删除第2行 从第6行和第7行开始,它应该删除第6行

我的意思是删除第4列中具有相同第2和第3列值且没有值的行。

谢谢

2 个答案:

答案 0 :(得分:4)

SQL Server的一个很好的功能是具有“可更新”CTE的能力。这意味着我们可以在with语句中识别行,然后在删除中使用它。

with todelete as (
      select t.*,
             count(*) over (partition by T_PSProjectId, T_CodePattern) as cnt
      from t
     )
delete from todelete
    where cnt > 1 and T_NCR is null;

这样做是使用窗口函数T_PSProjectId计算具有相同值T_CodePatterncount(*)的行数。然后deletion语句删除存在重复项的行,第三列具有NULL值。

答案 1 :(得分:1)

    This logic might resolve your query    


    DECLARE
  lv_dup_check NUMBER;
BEGIN
  FOR REC IN
  ( SELECT * FROM avrajit
  )
  LOOP
    SELECT COUNT(*)
    INTO lv_dup_check
    FROM avrajit -- to check whether duplicate exist or not
    WHERE name =rec.name
    AND salary = rec.salary;
    dbms_output.put_line(lv_dup_check);
    IF rec.department IS NULL AND lv_dup_check > 1 THEN -- if duplicate exists and the 3rd col null
      dbms_output.put_line ('deleted row'||' '||rec.salary);
      DELETE
      FROM avrajit --delete the 3rd null column with same value
      WHERE name      =rec.name
      AND salary      = rec.salary
      AND department IS NULL;
    END IF;
  END LOOP;
END;