【问题标题】:Vertica - Creating a calendar tableVertica - 创建日历表
【发布时间】:2013-06-17 20:02:41
【问题描述】:
我在 Vertica 中遇到了一个与填充不存在的日期相关的问题。我在网上看到了人们建议创建日历表的解决方案。
这是来自 stackoverflow 的一个这样的MYSQL 问题。
有没有一种方法可以使用 Vertica 支持的 SQL 而无需任何程序,使用另一个表中的 min() 和 max() 可用日期来创建日历表?
到目前为止,我遇到的大多数解决方案都是基于 T-SQL 的,并且日期是使用过程生成的。不幸的是,我 Vertica 并没有那么多 PL/SQL 或 T-SQL 能力。但是有一些我怀疑可能能够解决我的问题的分析函数。
【问题讨论】:
标签:
sql
date
vertica
analytic-functions
【解决方案1】:
正如我在问题中提到的,我现在正在回答这个问题,因为我找到了一个解决方案,可以解决使用开始和结束日期创建日历表或视图的问题。
CREATE table mytest.calendar
(
date DATE primary key
);
将边界日期插入日历表(您想要的表中的最小和最大日期)。
Insert into mytest.calendar (select min(date) from mytest.benchmarks);
Insert into mytest.calendar (select max(date) from mytest.benchmarks);
现在要生成中间日期,请执行以下操作:
SELECT CAST(slice_time AS DATE) date
FROM mytest.calendar mtc
TIMESERIES slice_time as '1 day'
OVER (ORDER BY CAST(mtc.date as TIMESTAMP));
您可以将其单独用作表格:
SELECT date from
(SELECT CAST(slice_time AS DATE) date
FROM mytest.calendar mtc
TIMESERIES slice_time as '1 day'
OVER (ORDER BY CAST(mtc.date as TIMESTAMP))) calendar
where mytest.isBusinessDay(date) = 't';
SELECT date
FROM
(SELECT date
FROM
(SELECT CAST(slice_time AS DATE) date
FROM mytest.calendar mtc
TIMESERIES slice_time as '1 day'
OVER (ORDER BY CAST(mtc.date as TIMESTAMP))
) calendar
WHERE mytest.isBusinessDay(date) = 't') calendar;
我有从开始日期(基准表中的 min(date))到结束日期(max(date))的日期列表