下表由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
答案 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
)
);