sql - SQL - 尝试通过加入日期维度表来创建每日日志
问题描述
如何正确加入日期维度表以便在 Snowflake 中创建每日日志视图。
这就是我想要制作的
WITH testing AS (
SELECT
21374884 AS projectid,
'2020-04-01'::DATE AS createdat,
'LIVE' AS Status
UNION ALL
SELECT 21374884 AS projectid,
'2020-04-10'::DATE AS createdat,
'COMPLETE' AS Status
UNION ALL
SELECT
1111111 AS projectid,
'2020-04-01'::DATE AS createdat,
'LIVE' AS Status
UNION ALL
SELECT 1111111 AS projectid,
'2020-04-10'::DATE AS createdat,
'COMPLETE' AS Status
)
哪个创建
PROJECTID 已创建状态 21374884 2020-04-01 直播 21374884 2020-04-10 完成 1111111 2020-04-01 直播 1111111 2020-04-10 完成
我想要将它加入到我的date_dim表中,这样如果我将每日状态从 2020 年 4 月 1 日拉到 2020 年 4 月 15 日,它就可以看起来像这样。
PROJECTID 已创建状态 21374884 2020-04-01 直播 21374884 2020-04-02 直播 21374884 2020-04-03 直播 21374884 2020-04-04 直播 21374884 2020-04-05 直播 ETC... 21374884 2020-04-10 完成 21374884 2020-04-11 完成 21374884 2020-04-12 完成 21374884 2020-04-13 完成 21374884 2020-04-14 完成 21374884 2020-04-15 完成 1111111 2020-04-01 直播 1111111 2020-04-02 直播 1111111 2020-04-03 直播 1111111 2020-04-04 直播 ETC.. 1111111 2020-04-10 完成 1111111 2020-04-11 完成 1111111 2020-04-12 完成 1111111 2020-04-13 完成 1111111 2020-04-14 完成 1111111 2020-04-15 完成 ……
解决方案
如果我们假设我们有一个定义并填充为的日期维度表:
CREATE OR REPLACE TEMPORARY TABLE date_dim (
the_date DATE
)
AS
SELECT DATEADD(DAY, SEQ8(), '2020-03-01'::DATE) AS the_date
FROM TABLE(GENERATOR(ROWCOUNT => 100)) -- assume a 100 row date dim table
;
另一个数据表定义和填充为:
CREATE OR REPLACE TEMPORARY TABLE testing (
projectid INTEGER
,createdat DATE
,status VARCHAR
)
AS
SELECT $1 AS projectid
,$2::DATE AS createdat
,$3 AS status
FROM VALUES
(21374884, '2020-04-01', 'LIVE')
,(21374884, '2020-04-10', 'COMPLETE')
,(1111111, '2020-04-01', 'LIVE')
,(1111111, '2020-04-10', 'COMPLETE')
;
然后我们可以产生你正在寻找的结果:
WITH cte_x AS (
SELECT projectid
,createdat
,LEAD(createdat) OVER (PARTITION BY projectid ORDER BY createdat) AS nextdat
,status
FROM testing t
)
SELECT cte_x.projectid
,dd.the_date AS createdat
,cte_x.status
FROM cte_x
JOIN date_dim dd
ON dd.the_date >= cte_x.createdat
AND (cte_x.nextdat IS NULL OR dd.the_date < cte_x.nextdat)
WHERE dd.the_date BETWEEN '2020-04-01'::DATE AND '2020-04-15'::DATE
ORDER BY 1,2
;
推荐阅读
- php - 访问标准类对象
- python - 决定在 setup.py 文件中安装哪个包
- javascript - 调用从 Angular 6 下载 pdf 的 Spring boot api 给出错误无法解析响应
- javascript - 无法使用 WebdriverIO 和 Mocha 执行页面对象模式
- sphinx - Sphinx MVA sql_attr_multi 结果总是在 FACET 查询的第一个字段上
- python - 生成器从多个文件中读取作为 keras 的输入进行多处理
- jolt - 如何仅在 JOLT 中的字段不为空时进行映射
- r - 通过循环 R 的条件语句
- sql - 情况下,帮助需要 SQL
- angular - 在角度中找不到模块“app/pages/pages.module”