按最近日期加入 BigQuery 中具有重复记录的表

Posted

技术标签:

【中文标题】按最近日期加入 BigQuery 中具有重复记录的表【英文标题】:Join by nearest date for the table with duplicate records in BigQuery 【发布时间】:2021-01-25 14:39:15 【问题描述】:

我有installs 表,其中的安装具有相同的user_id 但不同的install_date。 我希望通过install_date 将所有收入记录与最近的安装记录连接起来,该记录小于revenue_date,因为我需要它的source 字段值以进行下一次处理。 这意味着输出行数应该等于收入表记录。 如何在 BigQuery 中实现?

这是数据:

installs
install_date    user_id     source
--------------------------------
2020-01-10      user_a      source_I           
2020-01-15      user_a      source_II
2020-01-20      user_a      source_III
***info about another users***

revenue
revenue_date    user_id     revenue
--------------------------------------------
2020-01-11      user_a      10
2020-01-21      user_a      20
***info about another users***

【问题讨论】:

【参考方案1】:

考虑以下解决方案

select any_value(r).*, 
    array_agg(
        (select as struct i.* except(user_id)) 
        order by install_date desc 
        limit 1
    )[offset(0)].*
from `project.dataset.revenue` r 
join `project.dataset.installs` i 
on i.user_id = r.user_id 
and install_date < revenue_date
group by format('%t', r)  

如果应用于您问题中的样本数据 - 输出是

【讨论】:

嗨,我有同样的问题,但它是在 SQL 中。如何将此代码写入 SQL?问候【参考方案2】:

您也许可以为此使用left join

select r.*, i.* except (user_id)
from revenue r left join
     (select i.*,
             lead(install_date) over (partition by user_id order by install_date) as next_install_date
      from installs i
     ) i
     on r.user_id = i.user_id and
        r.revenue_date >= i.install_date and
        (r.revenue_date < i.next_install_date or i.next_install_date is null);

我过去曾遇到过left joins 和不等式的问题。不过,我认为这现在可以在 BQ 中使用。

【讨论】:

以上是关于按最近日期加入 BigQuery 中具有重复记录的表的主要内容,如果未能解决你的问题,请参考以下文章

在Oracle中选择具有最近日期和时间的记录[重复]

SQL BigQuery - 插入具有不同日期范围的行

在 Google BigQuery 中的最近一个或多个日期上左加入

加入创建重复行

在 C# 中插入具有重复记录列的 BigQuery 行

在加入 BigQuery 期间优先处理一个表