如何解决根据最接近的值连接 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 举报,一经查实,本站将立刻删除。