sql - 如何根据某些条件和多条件删除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
解决方案
您似乎只想要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
)
);
推荐阅读
- sql - 数据透视表构造
- php - 从 if 内部 for 循环中获取最后一个数据
- jmeter - 有没有办法通过 JMeter 中的 csv 文件传递用户定义的变量?
- javascript - 使用 ajax 为 select2 预选字段
- javascript - 我可以将 contenteditable td 限制为只允许数字吗?
- sonarqube - 连接到 SonarQube 的 Visual Studio SonarLint 扩展正在生成警告 CA0507 和 CA0064,并且没有声纳 Sxxx 警告
- javascript - material-ui version4.9.0中的自定义css
- c# - InvalidOperationException:无法创建“Microsoft.AspNetCore.Http.HttpContext”类型的实例
- javascript - 如何拒绝包含日期格式的非连续字符的字符串
- php - 如何将我的实体字段连接到同一个实体?