【问题标题】:How do you merge duplicate rows in a table in BigQuery - replacing missing values with most recent records如何在 BigQuery 中合并表中的重复行 - 用最新记录替换缺失值
【发布时间】:2021-09-28 11:42:34
【问题描述】:

例如,我有一个来自营销数据库的潜在客户表。有多个具有重复电子邮件值的记录。我想合并所有重复记录以汇总到最新更新的记录中,如果最新更新的记录缺少某些字段的值,则从最近更新的其他记录中更新这些字段。

表:

First last Email Phone Job Title State Last Updated
John Doe john.doe@example.com MD 1/1/2019
John low john.doe@example.com 1234567891 Coach VA 1/1/2018
John Doe john.doe@example.com 3214569875 Teacher CA 1/1/2017
Andy Yes john.doe@example.com DC 1/1/2021
Roby Doe john.doe@example.com 8628423578 Scientist VA 1/1/2025

输出 - 一条记录:

First last Email Phone Job Title State Last Updated
Andy Yes john.doe@example.com 1234567891 Coach DC 1/1/2021

在此示例中,由于 2021 年的记录缺少电话号码和职位,因此这些值是从最近更新的记录 (2018 年) 中提取的。

我曾考虑过使用 Distinct 或 Unique 函数,但不确定如何使用最后更新的记录执行合并,然后用其他最新记录填充空白值。任何帮助将不胜感激!

提前谢谢你。

最好, 达维特

【问题讨论】:

  • 为什么1/1/2025 行被忽略?

标签: sql google-bigquery


【解决方案1】:

考虑下面的方法 - 我认为它是最通用的 - 你只需要确保你在 unpivot 和 pivot 线上有正确的字段列表。虽然假设以下字段(First、Last、Phone、Job_Title、State)都是字符串数据类型

select First, Last, Email, Phone, Job_Title, State, max_Last_Updated as Last_Updated
from (
  select * except(Last_Updated), 
    max(Last_Updated) over(partition by Email) as max_Last_Updated
  from data
  unpivot (value for col in (First, Last, Phone, Job_Title, State))
  where true
  qualify row_number() over(partition by Email, col order by Last_Updated desc) = 1
)
pivot (max(value) for col in ('First', 'Last', 'Phone', 'Job_Title', 'State', 'Last_Updated'))           

如果应用于您问题中的样本数据(不包括 2025 行)- 输出为

【讨论】:

  • 谢谢你,Mikhail,我很快就会对此进行测试 :)
  • 是的!我的错我本来打算早点发布,但被一些修复所困扰。它就像一个魅力!我看到您并不是要确保所有值都是字符串值,因此我不得不对此进行一些调整。我发现了一些具有相同 Last_updated 时间的记录(不是很多),所以它仍然有一些欺骗,但没有那么多,所以我编写了另一个查询来修复这些记录。
【解决方案2】:

您需要一种方法来知道这些都是相同的记录。为此,您可以使用last_value(ignore nulls)

select t.*,
       last_value(first ignore nulls) over (partition by email order by last_updated) as imputed_first,
       last_value(last ignore nulls) over (partition by email order by last_updated) as imputed_first,
       . . .   -- and so on for the other columns
from t;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多