基于最接近的值连接 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 是给定时间戳的价格。当然,商品价格不会线性变化,而是在数据库中放入新记录时发生变化。所以如果我有(简化时间戳以提高可读性)
- 日期 100 的价格等于 14.02 美元
- 日期 300 的价格等于 23.02 美元
这些是基于购买日期的交易价格:
- purchase_date: 100 -> 价格 14.02$
- purchase_date: 148 -> 价格 14.02$
- purchase_date: 299 -> 价格 14.02$
- purchase_date: 300 -> 价格 23.02$
- purchase_date: 348 -> 价格 23.02$
您可以根据 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.
中保留一个指向唯一标识符的指针
我有两个 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 是给定时间戳的价格。当然,商品价格不会线性变化,而是在数据库中放入新记录时发生变化。所以如果我有(简化时间戳以提高可读性)
- 日期 100 的价格等于 14.02 美元
- 日期 300 的价格等于 23.02 美元
这些是基于购买日期的交易价格:
- purchase_date: 100 -> 价格 14.02$
- purchase_date: 148 -> 价格 14.02$
- purchase_date: 299 -> 价格 14.02$
- purchase_date: 300 -> 价格 23.02$
- purchase_date: 348 -> 价格 23.02$
您可以根据 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.