sql - 用 NULL 替换重复列值的优化解决方案
问题描述
我有一个具有以下结构和数据的表:
时间 | 公司 | 属性A | 属性 | 属性 |
---|---|---|---|---|
2020 年 12 月 4 日 13:21 | 测试A | 12 | 1 | 2 |
2020 年 12 月 4 日 13:21 | 测试B | 1 | 2 | 44 |
2020 年 12 月 4 日 13:22 | 测试B | 34 | 3 | 44 |
2020 年 12 月 4 日 13:22 | 测试A | 12 | 4 | 5 |
2020 年 12 月 4 日 13:21 | 测试C | 15 | 5 | 4 |
我想要实现的是以下内容:
- 如果对于特定公司,在 AttriX(X = A、B 或 C)列中有连续的、重复的值,那么我想用 NULL 替换这些重复值。
- 数据量很大,大约几百万,查询也必须是高性能的。
按照上述逻辑,我试图创建的视图应该返回给我这样的数据:
时间 | 公司 | 属性A | 属性 | 属性 |
---|---|---|---|---|
2020 年 12 月 4 日 13:21 | 测试A | 空值 | 1 | 2 |
2020 年 12 月 4 日 13:21 | 测试B | 1 | 2 | 空值 |
2020 年 12 月 4 日 13:22 | 测试B | 34 | 3 | 空值 |
2020 年 12 月 4 日 13:22 | 测试A | 空值 | 4 | 5 |
2020 年 12 月 4 日 13:21 | 测试C | 15 | 5 | 4 |
我已经碰壁了。谁能帮帮我吗?
解决方案
您可以使用lead()
和lag()
:
select t.*,
(case when lead(attria) over (partition by company order by time) = attria or
lag(attria) over (partition by company order by time) = attria
then null
else attria
end),
(case when lead(attrib) over (partition by company order by time) = attrib or
lag(attrib) over (partition by company order by time) = attrib
then null
else attrib
end),
(case when lead(attric) over (partition by company order by time) = attric or
lag(attric) over (partition by company order by time) = attric
then null
else attric
end)
from t
推荐阅读
- linux - 为什么 Linux Kernel copy 实现使用 AC 标志?
- qnamaker - 如何在 rasa 聊天机器人中获得 qna 制造商的回复?
- java - 包含预填充的 sql 数据库的步骤是什么?
- r - 通过根据标准为 ggplot 数据库着色来可视化时钟效果
- android - 为什么通知 PendingIntent 不起作用?
- ios - Xcode 模拟器没有显示 swift ui 占位符文本
- vb.net - VB.NET/Access - 检查每行的第一个值是否小于特定值,然后将文本添加到数据表中的每个对应行
- java - 如何根据单选按钮的选择显示/隐藏文本字段?
- regex - 什么是与 $ 元字符相关的“字符串结尾换行符”?
- java - 更改 JSF SessionScoped Bean 的值以注销用户