如何根据特定条件和多条件删除SQL表中的重复记录?

时间:2019-07-15 16:13:40

标签: sql sql-server stored-procedures duplicates ranking-functions

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

问题: 1)当“完成日期”不为空或填充日期时,删除EmployeeID的记录。

2)当该EmployeeID的记录包含一个由打开的作业组成的记录时(当JobNum为NOT NULL且CompDate为NULL时),删除该雇员的JobNum和CompDate列均具有空值的记录。这是重复的。

尝试使用带有case语句的排序功能。排名不正确。

       [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

1 个答案:

答案 0 :(得分:0)

您似乎只想要compdate为null的行以及以下两个条件之一:

  • 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
                  )
      );