在雪花中创建具有动态日期范围的日历表

Posted

技术标签:

【中文标题】在雪花中创建具有动态日期范围的日历表【英文标题】:Create Calendar Table in Snowflake with Dynamic Date Ranges 【发布时间】:2022-01-23 21:22:54 【问题描述】:

我想在 Snowflake 中创建具有动态日期的开始和结束日期的日历表。

开始日期和结束日期应该是销售事实表的最小和最大日期。

任何人都可以帮助我们如何在雪花视图/表格中传递动态日期。

【问题讨论】:

只是出于兴趣,您为什么要这样做?为什么不创建一个日历表,其开始日期在过去足够远,结束日期在未来足够远? 【参考方案1】:

您可以使用生成器函数来创建您需要的记录数,然后使用 ROW_NUMBER() 来确保它生成的是顺序的数字列表。有了它,您可以轻松地将该数字序列添加到您的开始日期。

在这个例子中,$numdays 需要是可变的,因为生成器函数只接受常量。这使得在视图中使用 as 有点棘手(您可以在视图中使用会话变量,但随后该视图将仅在您创建该变量的会话中工作),但您绝对可以使用此输出来创建一个表,并在存储过程中定期运行它。

set startdate = (select min(date(SALE_TIMESTAMP)) from fact_sales);
set numdays = (select datediff(DAY, min(date(SALE_TIMESTAMP)), max(date(SALE_TIMESTAMP))) from fact_sales);

SELECT DATEADD(DAY, c.n, $startdate) AS MY_DATE
FROM(SELECT ROW_NUMBER() OVER (ORDER BY 1) - 1 FROM TABLE(generator(rowcount=>$numdays))) c(n);

这是一种解决方法,可让您在视图中创建它。 这里的主要让步是对生成器可以创建的值的数量使用任意值(注意generator(rowcount=>10000))。您可以将此值设置得足够高,这样您就不太可能会用完日期,而且它仍然可以发挥作用。

SELECT 
    DATEADD(DAY, c.n, (SELECT date(min(SALE_TIMESTAMP)) FROM fact_sales)) AS MY_DATE
FROM(SELECT ROW_NUMBER() OVER (ORDER BY 1) - 1 FROM TABLE(generator(rowcount=>10000))) c(n)
WHERE MY_DATE <= (SELECT date(max(SALE_TIMESTAMP)) FROM fact_sales);

【讨论】:

这里是生成器函数中常量的另一种解决方法(尽管仍然需要运行额外的查询)community.snowflake.com/s/article/… 我同意其他回答,即想要一个仅限于事实表中日期的日期表似乎很奇怪。通常更容易建立一个表格,其中包含您的所有日期,然后是未来的一些日期。 很高兴我能帮上忙。不要忘记接受有用的答案,以供将来参考:)【参考方案2】:

您可以使用以下查询生成一个日期表,其中包含一些您可能需要用于数据操作的额外列。

select dateadd(day,seq,dt::date) dat ,  year(dat) as "YEAR", quarter(dat) as "QUARTER OF YEAR",
       month(dat) as "MONTH", day(dat) as "DAY", dayofmonth(dat) as "DAY OF MONTH",
       dayofweek(dat) as "DAY OF WEEK",dayname(dat) as dayName,
       dayofyear(dat) as "DAY OF YEAR"
from (
select seq4() as seq,  dateadd(month, 1, '1980-01-01'::date) dt from table(generator(rowcount => 16000))
);

【讨论】:

小心 seq4() 它不保证连续的 1-n 序列。它只是保证一个递增的序列,所以除了确保你没有跳过日期之外,使用 row_number() 会很有帮助。

以上是关于在雪花中创建具有动态日期范围的日历表的主要内容,如果未能解决你的问题,请参考以下文章

雪花:计算日历天数

在Python中动态计算不包括假期日历的工作日数

日期范围的SQL连接计数到日历日期表?

日期时间日历:在单个输入字段中选择日期范围

日期范围选择器 - 日历标题本地化格式

Jquery Datepicker在一个日历中选择多个日期范围