加入最近的时间戳?急板 SQL
Joining on closest timestamp? Presto SQL
我有 2 个 table 具有纪元值。一个每分钟有多个样本,例如:
id
First_name
epoch_time
1
Paul
1650317420
2
Jeff
1650317443
3
Raul
1650317455
还有一个每分钟 1 个样本:
id
Home
epoch_time
1
New York
1650317432
我想做的是加入两个 table 之间最接近的时间戳。理想情况下,找到 tables 1 和 2 之间最接近的值,然后从 table 1 和 2 填充一个字段。我想填充 'Home' 字段并保留其余记录table 1个原样,如:
id
Name
Home
epoch_time
1
Paul
New York
1650317420
2
Jeff
New York
1650317443
3
Raul
New York
1650317455
问题出在实际的连接上。 ID 不是唯一的,因此我不仅需要加入 ID,还需要扫描 2 table 之间最接近的纪元时间。我不能使用相关子查询,因为 Presto 不支持相关子查询。
回答了我自己的问题。它就像首先在每个分钟样本之间添加一些偏移量(例如 LEAD())一样简单,然后在向前看 59 秒的当前分钟样本的表之间的连接中使用 BETWEEN。这样:
WITH tbl1 AS (
SELECT
*
FROM table_1
),
tbl2 AS (
SELECT
*,
LEAD(epoch_time) OVER (
PARTITION BY
name,
home
ORDER BY
epoch_time
) - 1 AS next_time
FROM table_2
)
SELECT
t1.Id,
t1.Name,
t2.Home,
t1.epoch_time
FROM tbl1 t1
LEFT JOIN tbl2 t2
ON t1.Id = t2.Id
AND t1.epoch_time BETWEEN t2.epoch_time AND t2.next_time
我有 2 个 table 具有纪元值。一个每分钟有多个样本,例如:
id | First_name | epoch_time |
---|---|---|
1 | Paul | 1650317420 |
2 | Jeff | 1650317443 |
3 | Raul | 1650317455 |
还有一个每分钟 1 个样本:
id | Home | epoch_time |
---|---|---|
1 | New York | 1650317432 |
我想做的是加入两个 table 之间最接近的时间戳。理想情况下,找到 tables 1 和 2 之间最接近的值,然后从 table 1 和 2 填充一个字段。我想填充 'Home' 字段并保留其余记录table 1个原样,如:
id | Name | Home | epoch_time |
---|---|---|---|
1 | Paul | New York | 1650317420 |
2 | Jeff | New York | 1650317443 |
3 | Raul | New York | 1650317455 |
问题出在实际的连接上。 ID 不是唯一的,因此我不仅需要加入 ID,还需要扫描 2 table 之间最接近的纪元时间。我不能使用相关子查询,因为 Presto 不支持相关子查询。
回答了我自己的问题。它就像首先在每个分钟样本之间添加一些偏移量(例如 LEAD())一样简单,然后在向前看 59 秒的当前分钟样本的表之间的连接中使用 BETWEEN。这样:
WITH tbl1 AS (
SELECT
*
FROM table_1
),
tbl2 AS (
SELECT
*,
LEAD(epoch_time) OVER (
PARTITION BY
name,
home
ORDER BY
epoch_time
) - 1 AS next_time
FROM table_2
)
SELECT
t1.Id,
t1.Name,
t2.Home,
t1.epoch_time
FROM tbl1 t1
LEFT JOIN tbl2 t2
ON t1.Id = t2.Id
AND t1.epoch_time BETWEEN t2.epoch_time AND t2.next_time