来自详细说明事物变化的行中事物的每日活动计数

时间:2021-02-24 07:44:23

标签: sql presto trino

假设我有一张表格,其中列出了在第 N 天使用过我的服务的人,以及一张描述用户更改主题的表格。没有可用的表格告诉我他们当前使用的是什么主题。我想做的是每天都能看到这一点。

假设变更表如下所示。

| user_ID |   date   | theme |
|---------|----------|-------|
|  user1  | 1.1.2021 | Dark  |
|  user1  | 4.1.2021 | Light |
|  user2  | 2.1.2021 | Dark  |
|  user2  | 6.1.2021 | Light |

活动表只有 user_ID 和他们访问报告的服务的日期。

| user_ID |   date   |
|---------|----------|
|  user1  | 1.1.2021 |
|  user1  | 2.1.2021 |
|  user1  | 3.1.2021 |
|  user1  | 4.1.2021 |
|  user1  | 5.1.2021 |
|  user1  | 6.1.2021 |
|  user2  | 2.1.2021 |
|  user2  | 3.1.2021 |
|  user2  | 4.1.2021 |
|  user2  | 5.1.2021 |
|  user2  | 6.1.2021 |

现在我想做的是将第一个表连接到第二个表,这样他们在活动日期使用的主题就会列在那里。

| user_ID |   date   | theme |
|---------|----------|-------|
|  user1  | 1.1.2021 | Dark  |
|  user1  | 2.1.2021 | Dark  |
|  user1  | 3.1.2021 | Dark  |
|  user1  | 4.1.2021 | Light |
|  user1  | 5.1.2021 | Light |
|  user1  | 6.1.2021 | Light |
|  user2  | 2.1.2021 | Dark  |
|  user2  | 3.1.2021 | Dark  |
|  user2  | 4.1.2021 | Dark  |
|  user2  | 5.1.2021 | Dark  |
|  user2  | 6.1.2021 | Light |

我如何实现这一目标?假设可以有无限数量的主题。

1 个答案:

答案 0 :(得分:1)

一种方法是相关子查询,但我不确定 Presto 是否支持:

select a.*,
       (select c.theme
        from changes c
        where c.user_id = a.user_id and
              c.date <= a.date
        order by c.date desc
        limit 1
       ) as theme
from activity a;

一种可能更有效的方法是使用 left join,但要计算每次更改的“结束”日期:

select a.*, c.theme
from activity a left join
     (select c.*,
             lead(date) over (partition by user_id order by date) as next_date
      from changes c
     ) c
     on a.user_id = c.user_id and
        a.date >= c.date and
        (a.date < c.next_date or c.next_date is null);