【问题标题】:Optimized solution for replacing repeating column values with NULL用 NULL 替换重复列值的优化解决方案
【发布时间】:2020-12-10 02:29:47
【问题描述】:

我有一张表,其结构和数据如下:

Time Company AttriA AttriB AttriC
12/4/2020 13:21 TestA 12 1 2
12/4/2020 13:21 TestB 1 2 44
12/4/2020 13:22 TestB 34 3 44
12/4/2020 13:22 TestA 12 4 5
12/4/2020 13:21 TestC 15 5 4

我想要达到的目标如下:

  • 如果对于特定公司,在 AttriX(X = A、B 或 C)列中有 连续、及时的重复值,那么我想用 NULL 替换这些重复值。
  • 数据量很大,大约几百万,查询也必须是高性能的。

按照上述逻辑,我尝试创建的视图应返回如下数据:

Time Company AttriA AttriB AttriC
12/4/2020 13:21 TestA NULL 1 2
12/4/2020 13:21 TestB 1 2 NULL
12/4/2020 13:22 TestB 34 3 NULL
12/4/2020 13:22 TestA NULL 4 5
12/4/2020 13:21 TestC 15 5 4

我遇到了这个问题。谁能帮帮我?

【问题讨论】:

  • 抱歉,如果您必须运行 sn-p 才能查看表格。我试图让它整洁。
  • Stackoverflow 有一个表格选项顺便说一句,ascii 表格最适合大多数人。
  • 您标记了“sql”,但只显示了一些 html 渲染。什么数据库?什么数据库结构?您如何查询您的数据库以及如何从该查询的结果生成您的 html?
  • @mivk - 我已经更新了帖子以反映表格。
  • @venky 是的,我看到并更新了帖子。非常感谢!

标签: sql


【解决方案1】:

您可以使用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

【讨论】:

  • 非常感谢@Gordon Linoff。这绝对有效。有没有一种方法可以让第一个值保持原样,并从第二个重复值替换为 NULL?
  • @thestarsailor 。 . .我不明白你的评论。这不是返回你想要的数据吗?
  • @thestarsailor 。 . .这应该适用于您在问题中提供的数据。它可能无法处理您的数据有多种原因。也许列值 look 相同但不同(例如由于尾随空格或隐藏字符)。也许您对时间值有确切的联系。我建议您提出一个 问题,并举例说明它在哪里不起作用。
  • 我的意思是,我们能不能这样说,如果在当前值之前有超过 1 个重复值,或者在当前值之后有超过 1 个重复值,则将其设为 null。
  • @thestarsailor 。 . .这个答案可以处理这种情况。
猜你喜欢
  • 1970-01-01
  • 2015-10-12
  • 1970-01-01
  • 1970-01-01
  • 2020-09-10
  • 2021-11-20
  • 1970-01-01
  • 2017-07-05
  • 1970-01-01
相关资源
最近更新 更多