首页 > 解决方案 > 如何根据某些条件和多条件删除SQL表中的重复记录?

问题描述

下表由 EmployeeID、JobNum、CompDate 列组成。基本上有 3 名不同的员工具有特定的工作 ID 和与他们相关的完成日期时间。有一些 jobNum 与特定的 EmployeeID 没有关联,并且可能有一个完整的日期。

问题:1) 当 Complete date 不为 null 或填充了日期时,删除 EmployeeID 的记录。

2) 当该 EmployeeID 的记录包含一个空缺职位时(当 JobNum 不为 NULL 且 CompDate 为 NULL 时),删除该员工的 JobNum 和 CompDate 列都具有空值的记录。这是重复的。

尝试使用带有案例陈述的排名函数。排名不正确。

       [JobNum],       
       [CompDate], 
       RANK ( ) OVER( PARTITION BY [EmployeeID] ORDER BY 
        CASE WHEN ([JobNum] is null AND [CompDate] is null) THEN 1 
         WHEN ([JobNum] is not null AND [CompDate] is null) THEN 2
         WHEN ([JobNum] is not null AND [CompDate] is not null) THEN 3 
            END ASC) as Rank
  FROM [dbo].test1
  WHERE [EmployeeID] IN (SELECT [EmployeeID] FROM dbo.test1
            GROUP BY [EmployeeID]
            HAVING COUNT(*) > 1) 
EmployeeID    JobNum          CompDate                    Rank
   1             NULL            NULL                      1
   1             401             NULL                      2
   1             435             NULL                      2
   1             358       2019-07-15 15:10:57.810         4
   2             285             NULL                      1
   2             299       2019-07-15 15:14:04.603         2
   2             305       2019-07-14 15:10:57.810         2
   2             330       2019-06-13 10:10:30.710         2
   3             NULL           NULL                       1
   3             435            NULL                       2
   3             402       2019-07-11 13:10:47.610         3
Ex:    

                EmployeeID    JobNum          CompDate                    Rank
Delete this ->       1           NULL            NULL                      1
when this exists ->  1           401             NULL                      2
when this exists ->  1           435             NULL                      2
                     1           358       2019-07-15 15:10:57.810         4

标签: sqlsql-serverstored-proceduresduplicatesranking-functions

解决方案


您似乎只想要compdatenull 和以下两个条件之一的行:

  • jobnum一片空白
  • jobnum不为空,并且员工的行没有jobnum为空

我不确定rank()与这些过滤条件有什么关系:

select t.*
from test1 t
where t.compdate is not null and  -- condition 1
      (t.jobnum is null or
       not exists (select 1
                   from test1 tt
                   where tt.employeeid = t.employeeid and 
                         tt.compdate is null and
                         tt.jobnum is null
                  )
      );

推荐阅读