在最近的日期加入 [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 中的无效日期

无法在 Amazon Redshift 中将时间戳转换为日期

Amazon Redshift 返回日期名称

如何在 Amazon Redshift 中将列从字符串更改为日期?

Amazon Redshift:公共假期表的重复日期

生成带有日期和小时的时间序列并在 Amazon Redshift 中创建表