如何在雪花环境中给出开始日期和结束日期时创建时间序列?
How to create a time series when start and end dates are given in a snowflake environment?
给定一个包含开始日期和结束日期列的 table,我试图以时间序列的形式获取单独的行条目,所有日期都在上述日期之间
我试过这里的一段代码但是
https://community.periscopedata.com/t/18wkh8/generate-series-of-dates-in-snowflake
select dateadd(day, '-' || seq4(), current_date()) as dte
from table (generator(rowcount => (Difference between start and end date))
Input:
Start_date End_date Value
2019-01-01 2019-01-15 1$
2019-01-16 2019-01-23 2$
Output:
Date Value
2019-01-01 1$
2019-01-02 1$
---- so on
2019-01-05 1$
2019-01-16 2$
--- so on
2019-01-23 2$
rowcount => 需要是一个常量,但您可以将其设置得足够大并稍后对其进行过滤,而不会花费明显的执行时间。例如,如果 DTS 是具有日期范围的 table 的名称,则以下内容有效:
with
maxdiff as (
select max(datediff(day, start_date, end_date)) days
from dts),
cal as (
select seq4() n
from table(generator(rowcount => 10000))
)
select
dateadd(day, n, start_date) theDate,
value
from dts join cal
where n <= (select days+1 from maxdiff)
and theDate >= start_date and theDate <= end_date
order by theDate
;
Stuart 的回答有问题:seq4()
不能保证给出序号——您可能会以一系列不同的日期结束。
相反,您可以这样做:
select -1 + row_number() over(order by 0) i, start_date + i generated_date
from (select '2020-01-01'::date start_date, '2020-01-15'::date end_date)
join table(generator(rowcount => 10000 )) x
qualify i < 1 + end_date - start_date
给定一个包含开始日期和结束日期列的 table,我试图以时间序列的形式获取单独的行条目,所有日期都在上述日期之间
我试过这里的一段代码但是 https://community.periscopedata.com/t/18wkh8/generate-series-of-dates-in-snowflake
select dateadd(day, '-' || seq4(), current_date()) as dte
from table (generator(rowcount => (Difference between start and end date))
Input:
Start_date End_date Value
2019-01-01 2019-01-15 1$
2019-01-16 2019-01-23 2$
Output:
Date Value
2019-01-01 1$
2019-01-02 1$
---- so on
2019-01-05 1$
2019-01-16 2$
--- so on
2019-01-23 2$
rowcount => 需要是一个常量,但您可以将其设置得足够大并稍后对其进行过滤,而不会花费明显的执行时间。例如,如果 DTS 是具有日期范围的 table 的名称,则以下内容有效:
with
maxdiff as (
select max(datediff(day, start_date, end_date)) days
from dts),
cal as (
select seq4() n
from table(generator(rowcount => 10000))
)
select
dateadd(day, n, start_date) theDate,
value
from dts join cal
where n <= (select days+1 from maxdiff)
and theDate >= start_date and theDate <= end_date
order by theDate
;
Stuart 的回答有问题:seq4()
不能保证给出序号——您可能会以一系列不同的日期结束。
相反,您可以这样做:
select -1 + row_number() over(order by 0) i, start_date + i generated_date
from (select '2020-01-01'::date start_date, '2020-01-15'::date end_date)
join table(generator(rowcount => 10000 )) x
qualify i < 1 + end_date - start_date