基于最接近的值连接 prestoDB 中的两个表

Join of two tables in prestoDB based on closest value

我有两个 table,一个有时间序列值,另一个有价格。例如

时间序列

purchase_date   user_id    item_id
1618231488      123        2313
1618244875      435        2314
1618266985      23         2313
1618268671      54         144
...

价格

item_id   price_date     price
2313      1618231400     233.67
2313      1618232400     294.12
2313      1618254400     224.14
144       1618254400     212.34
...

目标:评估用户在给定购买时间戳购买的每件商品的价格。

正如您从示例数据中看到的那样,购买可以在任何时间戳发生,而商品的价格每小时存储一次却不一致。因此,例如,我们可以在一天和第二天每小时更新一次商品价格,也许只更新几次。发生这种情况是因为系统仅在价格发生变化时才记录价格。

使用 SQL 查询(引擎是 PrestoDB)并记住时间序列 table 可能有数百万行(而价格高达几十万),如何我可以得到一个 table 如下

timeseries_with_price

date          user   item   price
1618231488    123    2313   xxx.xx
1618244875    435    2314   xxx.xx
1618266985    23     2313   xxx.xx
1618268671    54     144    xxx.xx
...

其中 xxx.xx 是给定时间戳的价格。当然,商品价格不会线性变化,而是在数据库中放入新记录时发生变化。所以如果我有(简化时间戳以提高可读性)

这些是基于购买日期的交易价格:

您可以根据 item_id 连接两个 table,然后仅连接 select 时间最接近的元素,例如:

select purchase_date, 
       user_id,
       item_id,
       min_by(price, abs(purchase_date-price_date)) as price
from timeseries join price using(item_id)
group by purchase_date, user_id, item_id

请在此处查看 min_by 函数的文档:https://prestodb.io/docs/current/functions/aggregate.html#min_by

我特意将价格 table 放在联接的右侧,因为它是两者中最小的。不过,理想情况下,当用户进行购买时,您会在 price table.

中保留一个指向唯一标识符的指针