微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

根据最接近的值连接 prestoDB 中的两个表

如何解决根据最接近的值连接 prestoDB 中的两个表

我有两张表,一张是时间序列值,另一张是价格。例如

时间序列

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)并记住时间序列表可以有数百万行(而价格高达几十万),我如何获得如下表

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 是给定时间戳的价格。当然,商品价格不是线性变化的,而是在数据库中有新记录时发生变化。所以如果我有(为了可读性而简化时间戳)

  • 第 100 天的价格等于 14.02 美元
  • 第 300 天的价格等于 23.02 美元

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

  • 购买日期:100 -> 价格 14.02 美元
  • 购买日期:148 -> 价格 14.02 美元
  • 购买日期:299 -> 价格 14.02 美元
  • 购买日期:300 -> 价格 23.02$
  • 购买日期:348 -> 价格 23.02 美元

解决方法

您可以基于 item_id 连接两个表,然后仅选择时间上最接近的元素,例如:

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,item_id

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

我有意将价格表放在连接的右侧,因为它是两者中最小的。但理想情况下,当用户进行购买时,您会在 price 表中保留一个指向唯一标识符的指针。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。