sql - 如何从三个独立的表构建事件表,显示随时间的增量变化?

标签 sql amazon-athena presto

我正在尝试构建一个数据集,显示某些产品属性随时间的增量变化。数据位于 AWS Athena 中的三个单独的表中,每个表存储不同的属性,并且可以在不同时间独立更新。 tbl1 可以连接到 tbl2tbl2 可以连接到 tbl3。表之间始终存在一对一关系,因此 tbl1.id=1 将仅与 tbl2.id=2tbl2.id 相关在本例中,=2 仅与 tbl3.id=3 相关:

tbl1
| id | updated_at       | bool  |
| 1  | 2019-09-10 06:00 | True  |
| 1  | 2020-08-05 10:00 | False |
| 1  | 2020-09-03 15:00 | True  |

tbl2
| id | tbl1_id | updated_at       | desc    |
| 2  | 1       | 2019-09-10 06:00 | thing 1 |

tbl3
| id | tbl2_id | updated_at       | value |
| 3  | 2       | 2019-09-10 06:00 | 100   |
| 3  | 2       | 2019-09-19 09:00 | 50    |
| 3  | 2       | 2019-12-02 11:00 | 20    |

我正在尝试编写一个查询,将该数据连接到一个表中,并且每个增量更新都有一行。从上表中可以看出,最初的插入是在 2019 年 9 月 10 日,然后在 tbl1tbl3 之间进行了四次更改,因此最终应该是五行,如下所示:

| tbl1_id | tbl1_updated_at  | bool  | tbl2_id | tbl2_updated_at  | desc   | tbl3_id | tbl3_updated_at  | value |
| 1       | 2019-09-10 06:00 | True  | 2       | 2019-09-10 06:00 | thing1 | 3       | 2019-09-10 06:00 | 100   |
| 1       | 2019-09-10 06:00 | True  | 2       | 2019-09-10 06:00 | thing1 | 3       | 2019-09-19 09:00 | 50    |
| 1       | 2019-09-10 06:00 | True  | 2       | 2019-09-10 06:00 | thing1 | 3       | 2019-12-02 11:00 | 20    |
| 1       | 2020-08-05 10:00 | False | 2       | 2019-09-10 06:00 | thing1 | 3       | 2019-12-02 11:00 | 20    |
| 1       | 2020-09-03 15:00 | True  | 2       | 2019-09-10 06:00 | thing1 | 3       | 2019-12-02 11:00 | 20    |

我首先想到将所有内容连接在一起并使用一些 WHERE 子句,例如:

select
*
from
tbl1
left join tbl2 on tbl1.id = tbl2.tbl1_id
left join tbl3 on tbl2.id = tbl3.tbl2_id
where
???

但无法让它工作,并且不确定这是否会工作。也许有某种窗口函数可以做到这一点?感觉应该可以在 SQL 中做到这一点,但经过两天的尝试,我完全不知道如何做到!

最佳答案

这相当复杂。如果你有 tbl1 会更简单所有表中的 id。

无论如何,我们的想法是 union all这些列以及 tbl1 id 和 updated_at 。然后聚合,因此每个 id 有一行和date .

最后,使用last_value()ignore nulls获取填充的最新值的选项:

with t as (
      select id, updated_at, max(bool) as bool, max(descr) as descr, max(value) as value
      from (select tbl1.id, tbl1.updated_at, tbl1.bool, null as descr, null as value
            from tbl1 
            union all
            select tbl2.tbl1_id, tbl2.updated_at, null, tbl2.descr, null
            from tbl2
            union all
            select tbl2.tbl1_id, tbl2.updated_at, null, null, tbl3.value
            from tbl2 join
                 tbl3
                 on tbl2.id = tbl3.tbl2_id
           ) t
     group by id, updated_at
    )
select id, updated_at,
       last_value(bool ignore nulls) over (partition by id order by updated_at) as bool,
       last_value(descr ignore nulls) over (partition by id order by updated_at) as descr,
       last_value(value ignore nulls) over (partition by id order by updated_at) as value
from t;

关于sql - 如何从三个独立的表构建事件表,显示随时间的增量变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67326414/

相关文章:

mysql - SQL : how to select different rows where values are equal to an set of values?

sql - MySQL #1140 - GROUP 列的混合

php - 使用 mysqli bind_result 未从数据库中获取值

amazon-web-services - Presto SQL 中的 "interactive query"或 "interactive analytics"是什么意思?

amazon-web-services - AWS DMS : How to handle TIMESTAMP_MICROS parquet fields in Presto/Athena

C# ASP.Net Parameters.AddWithValue 拒绝参数的空值

sql - 将 CASE WHEN 与多个 When 一起使用只会产生 BOOLEAN 值

amazon-web-services - 除了 "Bucketing"之外,还有其他方法可以使用 Athena 指定输出文件大小或输出文件数量吗?

amazon-web-services - Amazon Athena View 实际上是 hive View ,还是单独的附加 View ?

mysql - 使用 presto 如何显示像 XXX 这样的表格