SQL - Vertica:如何使用大多数以前的日期数据生成每日行
Posted
技术标签:
【中文标题】SQL - Vertica:如何使用大多数以前的日期数据生成每日行【英文标题】:SQL - Vertica: How to generate daily rows with most previous date data 【发布时间】:2019-10-14 15:35:59 【问题描述】:我有一个如下的基表:
score_upd (Upd_dt,Url,Score) AS (
SELECT DATE '2019-07-26','A','x'
UNION ALL SELECT DATE '2019-07-26','B','alpha'
UNION ALL SELECT DATE '2019-08-01','A','y'
UNION ALL SELECT DATE '2019-08-01','B','beta'
UNION ALL SELECT DATE '2019-08-03','A','z'
UNION ALL SELECT DATE '2019-08-03','B','gamma'
)
Upd_dt URL Score
2019-07-26 A x
2019-07-26 B alpha
2019-08-01 A y
2019-08-01 B beta
2019-08-03 A z
2019-08-03 B gamma
我想在daily-url级别创建一个表,使用新行的大多数先前日期的值,结果应如下所示:
score_upd (Upd_dt,Url,Score) AS (
SELECT DATE '2019-07-26','A','x'
UNION ALL SELECT DATE '2019-07-26','B','alpha'
UNION ALL SELECT DATE '2019-07-27','A','x'
UNION ALL SELECT DATE '2019-07-27','B','alpha'
UNION ALL SELECT DATE '2019-07-28','A','x'
UNION ALL SELECT DATE '2019-07-28','B','alpha'
UNION ALL SELECT DATE '2019-07-29','A','x'
UNION ALL SELECT DATE '2019-07-29','B','alpha'
UNION ALL SELECT DATE '2019-07-30','A','x'
UNION ALL SELECT DATE '2019-07-30','B','alpha'
UNION ALL SELECT DATE '2019-07-31','A','x'
UNION ALL SELECT DATE '2019-07-31','B','alpha'
UNION ALL SELECT DATE '2019-08-01','A','y'
UNION ALL SELECT DATE '2019-08-01','B','beta'
UNION ALL SELECT DATE '2019-08-02','A','y'
UNION ALL SELECT DATE '2019-08-02','B','beta'
UNION ALL SELECT DATE '2019-08-03','A','z'
UNION ALL SELECT DATE '2019-08-03','B','gamma'
UNION ALL SELECT DATE '2019-08-04','A','z'
UNION ALL SELECT DATE '2019-08-04','B','gamma'
UNION ALL SELECT DATE '2019-08-05','A','z'
UNION ALL SELECT DATE '2019-08-05','B','gamma'
)
看起来像:
Upd_dt URL Score
2019-07-26 A x
2019-07-26 B alpha
2019-07-27 A x
2019-07-27 B alpha
2019-07-28 A x
2019-07-28 B alpha
2019-07-29 A x
2019-07-29 B alpha
2019-07-30 A x
2019-07-30 B alpha
2019-07-31 A x
2019-07-31 B alpha
2019-08-01 A y
2019-08-01 B beta
2019-08-02 A y
2019-08-02 B beta
2019-08-03 A z
2019-08-03 B gamma
2019-08-04 A z
2019-08-04 B gamma
2019-08-05 A z
2019-08-05 B gamma
.
.
.
目前的流程是: 我从 2019 年 7 月 26 日到今天建立了一个每日维度表:
/* 选择 CAST(slice_time AS DATE) 日期 FROM testcalendar mtc TIMESERIES slice_time 为 '1 天' OVER (ORDER BY CAST(mtc.dates as TIMESTAMP)); */
所以我明白了:
日期
2019-07-26
2019-07-27
2019-07-28
2019-07-29
.
.
.
2019-10-12(今天)
我正在考虑是否可以使用诸如“插入先前值”之类的功能按日期加入我的第一个表,通过使用大多数先前日期数据中的值来生成缺失的天数,但它失败了。
结果未生成缺失天数的行。
如果有人对此有更好的想法,请告诉我。
谢谢!
【问题讨论】:
【参考方案1】:作为一个开始警告:仅在真正需要时才存储“每日照片”。在我的过去,我曾经每年有太多 364 行,因为这些值每年只改变一次。在 Vertica 中,这需要许可证、CPU 和时钟时间来加入和分组......
但是,对于其余的 - 好的开始。
但您可以应用 TIMESERIES 而无需构建日历。
诀窍是手动“推断”您可以自动INTERPOLATE
的内容。
添加一个内联“填充”表,其中包含每个 URL 的最新值,但将其提供为 CURRENT_DATE
而不是最新的实际日期 - 使用 Vertica 特有的分析限制子句 LIMIT 1 OVER(PARTITION BY url ORDER BY upd_dt DESC)
.
用您的输入 UNION SELECT 填充表,并将 TIMESERIES 子句应用于该 UNION SELECT。
像这样:
WITH
-- your input ...
score_upd (Upd_dt,Url,Score) AS (
SELECT DATE '2019-07-26','A','x'
UNION ALL SELECT DATE '2019-07-26','B','alpha'
UNION ALL SELECT DATE '2019-08-01','A','y'
UNION ALL SELECT DATE '2019-08-01','B','beta'
UNION ALL SELECT DATE '2019-08-03','A','z'
UNION ALL SELECT DATE '2019-08-03','B','gamma'
)
-- real WITH clause would start here ...
,
-- newest row per Url, just with current date
pad_newest AS (
SELECT
CURRENT_DATE
, url
, score
FROM score_upd
LIMIT 1 OVER(PARTITION BY url ORDER BY upd_dt DESC)
)
,
with_newest AS (
SELECT
*
FROM score_upd
UNION ALL
SELECT *
FROM pad_newest
)
SELECT
ts_dt::DATE AS upd_dt
, url AS url
, TS_FIRST_VALUE(score) AS score
FROM with_newest
TIMESERIES ts_dt AS '1 day' OVER (
PARTITION BY url ORDER BY upd_dt::TIMESTAMP
)
ORDER BY 1,2
;
【讨论】:
以上是关于SQL - Vertica:如何使用大多数以前的日期数据生成每日行的主要内容,如果未能解决你的问题,请参考以下文章