【问题标题】: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))的日期列表

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-31
      • 1970-01-01
      • 2022-06-20
      • 2021-04-19
      • 1970-01-01
      相关资源
      最近更新 更多