具有日期序列的交叉连接红移 [英] Cross join Redshift with sequence of dates

查看:29
本文介绍了具有日期序列的交叉连接红移的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想用红移来跟踪雅典娜查询,但到目前为止还不可能重现它。查询应该在CREATE TABLE AS ()语句中调用,因此GENERATE_SEQUENCE()思想可能不起作用。有什么想法吗?

雅典娜查询:

SELECT
    *
FROM table_one t1
CROSS JOIN UNNEST(slice(sequence(t1.effective_date, t1.expiration_date, INTERVAL  '1' MONTH), 1 ,12)) AS t (sequence_date)

根据要求,我添加了一个示例来说明我正在尝试做什么。基本上我有一个有效期间隔的记录(年份单位1、2、3.)我想将其复制N次,以便将每个新记录指定为日期YYYY-MM-DD+INTERVAL*12/N个月(请参见示例)

原始记录:

日期 变量
2021-05-06

目标(N=12,间隔1年)

日期 变量
2021-05-06 值/12
2021-06-06 值/12
2021-07-06 值/12
2021-08-06 值/12
2021-08-06 值/12
2021-10-06 值/12
2021-11-06 值/12
2021-12-06 值/12
2022-01-06 值/12
2022-02-06 值/12
2022-03-06 值/12
2022-04-06 值/12

目标(N=4,间隔两年)

日期 变量
2021-05-06 值/2
2021-11-06 值/2
2022-05-06 值/2
2022-11-06 值/2

感谢您的帮助

推荐答案

可能最好的方法是使用草书cte-https://docs.aws.amazon.com/redshift/latest/dg/r_WITH_clause.html

示例-Generate rows with incrementing dates based on just a starting date in Redshift

您似乎正在做的事情比本例稍微复杂一些。如果您无法获得它,请发布一些示例数据,这里的专家可以使用它们为您创建示例查询。

=

使用新信息和上面的递归CTE过程,我得出了以下结论:

drop table if exists table_one ;
create table table_one (
dt date,
info varchar(32),
n int,
y int);

insert into table_one values ('2021-05-06', 'record info here', 12, 1);
commit;

with recursive dates(dt, info, n, y, end_dt) as
( select dt::date, info, n, y, dateadd(year, y, dt)::date as end_dt
  from table_one
  union all
  select dateadd(months, 12 * y / n, dt)::date as dt, info, n, y, end_dt::date
  from dates d
  where d.dt < dateadd(month, -12 * y /n, end_dt)
  )
select dt, info from dates;

我不确定您是否希望以这种方式将N和Year添加到该过程中,但希望您可以从此处进行修改。只需更改TABLE_ONE INSERT语句中的N和Year的值,然后重新运行整个过程即可获得第二个结果。

这篇关于具有日期序列的交叉连接红移的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆