在最近的日期加入 [Amazon Redshift]
Posted
技术标签:
【中文标题】在最近的日期加入 [Amazon Redshift]【英文标题】:Joining on closest date [Amazon Redshift] 【发布时间】:2021-09-28 18:49:33 【问题描述】:我正在尝试通过相同的用户 ID 对 Event_1 和 Event_2 进行左连接,并到最大的前一个日期。
事件_1
| timestamp | user_id | n_trigg |
|-------------------------|---------|---------|
| 2021-04-24 15:39:51.667 | 1213 | 1 |
| 2021-04-24 15:40:13.631 | 1213 | 2 |
| 2021-04-24 18:51:22.651 | 1213 | 3 |
Event_2(发生在 Event_1 之后)
| timestamp | user_id | product_id |
|-----------------------|---------|------------|
|2021-04-24 15:39:56.483| 1213 | 11313 |
|2021-04-24 15:40:14.775| 1213 | 11313 |
我想得到以下结果:
timestamp_event_1 | user_id | n_trigg | timestamp_event_2 | product_id |
---|---|---|---|---|
2021-04-24 15:39:51.667 | 1213 | 1 | 2021-04-24 15:39:56.483 | 11313 |
2021-04-24 15:40:13.631 | 1213 | 2 | 2021-04-24 15:40:14.775 | 11313 |
我已经尝试过了,但它不适用于 Redshift:
SELECT *
FROM Event_1 LEFT JOIN Event_2 ON Event_1.user_id = Event_2.user_id
AND Event_2.timestamp = (select min(timestamp) from Event_2
where Event_2.user_id=Event_1.user_id
and Event_2.timestamp > Event_1.timestamp)
但我收到以下错误:
ERROR: This type of correlated subquery pattern is not supported yet
提前非常感谢您。 使用 Redshift 1.0.29551
【问题讨论】:
【参考方案1】:正如错误消息所说,Redshift 不支持这种类型的相关子查询。因此,您需要将其重写为 JOIN 。如果这些表很大,请小心进行不等式连接,因为这可能导致数据爆炸。如果发生这种情况,有一些 UNION 和窗口技术可以帮助您解决此问题。
【讨论】:
【参考方案2】:对于任何可能遇到相同问题的人,这是一位同事提供给我的答案:
select
"timestamp",
user_id,
n_trigg,
timestamp_event_2,
product_id
from
(--a
select
e1."timestamp",
e1.user_id,
e1.n_trigg,
e2."timestamp" timestamp_event_2,
e2.product_id,
row_number() over (partition by e1.n_trigg order by e2."timestamp" asc) ranking
from
event_1 e1
join
event_2 e2 on e1.user_id = e2.user_id and e2."timestamp" > e1."timestamp"
) a
where
ranking = 1
【讨论】:
这是一个有趣的问题,当我有时间时,我进一步探索了它。我已经用代码和分析写了一篇关于它的博客文章 - wad-design.s3-website-us-east-1.amazonaws.com/… 所以如果你正在处理非常大的表或者看到的速度不是你喜欢的,那么看看。当数据变大时,有一种更快的方法来执行最近的日期连接。以上是关于在最近的日期加入 [Amazon Redshift]的主要内容,如果未能解决你的问题,请参考以下文章
无法在 Amazon Redshift 中将时间戳转换为日期