从历史数据构建每月快照视图

Posted

技术标签:

【中文标题】从历史数据构建每月快照视图【英文标题】:Building a monthly Snapshot VIEW from historical data 【发布时间】:2021-11-30 05:48:57 【问题描述】:

我的历史历史数据如下:

我需要获取每个月末机会的 DB 视图,例如

将其实现为雪花视图的最佳方法是什么?

【问题讨论】:

【参考方案1】:

有两部分,视图中的 SQL 和要使用的视图。

SQL 似乎是每个机会的“本月的最后一个值”,并且删除不正确,可以通过多种方式完成。

在我的脑海中,本月的最新值听起来像 WHERE 子句,比如针对 ROW_NUMBER:

SELECT last_modified_date,
    opportunity,
    amount
FROM table
WHERE deleted == false
  AND ROW_NUMBER() OVER(PARTITON BY date_trunc('month', last_modified_date) ORDER BY last_modified_date DESC) = 1

这将保留您想要的值,然后我们需要将 last_modified_date 调整为该月的最后一天,这可以通过

SELECT dateadd('day', -1 ,dateadd('month', 1, date_trunc('month', last_modified_date))) as month_end

可以组合为:

SELECT dateadd('day', -1 ,dateadd('month', 1, date_trunced)) as month_end,
    opportunity,
    amount
FROM (
    SELECT 
        date_trunc('month', last_modified_date) AS date_trunced
        opportunity,
        amount,
        ROW_NUMBER() OVER(PARTITON BY date_trunced ORDER BY last_modified_date DESC) AS rn
    FROM table
    WHERE deleted == false
)
WHERE rn = 1
ORDER BY 1,2;

如果你有几百万行,你可以只创建一个普通视图,但是如果你有数十亿行和多年的数据,那么前几个月将会相当严重的流失,所以物化视图会会有所帮助,但我很确定您 cannot use a ROW_NUMBER in a materialized 视图,因此您可以手动构建“历史月份”表和“当前月份”视图,并将它们结合在一起,并在某个时期(如月份)将当前时期数据滚动到历史,因为它变得稳定。

【讨论】:

以上是关于从历史数据构建每月快照视图的主要内容,如果未能解决你的问题,请参考以下文章

在recyclerview kotlin中插入firebase快照

修改AWR采样间隔和历史快照保留时间

物化视图

数据库(Oracle)基本知识点总结

Maven 快照及构建自动化

Rails:如何构建每天/每月/每年的统计数据或如何缺少与数据库无关的 SQL 函数(例如:STRFTIME、DATE_FORMAT、DATE_TRUNC)