按最近日期加入 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 join
s 和不等式的问题。不过,我认为这现在可以在 BQ 中使用。
【讨论】:
以上是关于按最近日期加入 BigQuery 中具有重复记录的表的主要内容,如果未能解决你的问题,请参考以下文章