【问题标题】:Cross join Redshift with sequence of dates使用日期序列交叉连接 Redshift
【发布时间】:2022-01-14 07:53:45
【问题描述】:

我想用 redshift 来跟踪 athena 查询,但到目前为止还无法重现它。查询应该在 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 + 间隔 * 12 /N 个月(见示例)

原记录:

Date variables
2021-05-06 values

成为(N=12,间隔 1 年)

Date variables
2021-05-06 values/12
2021-06-06 values/12
2021-07-06 values/12
2021-08-06 values/12
2021-08-06 values/12
2021-10-06 values/12
2021-11-06 values/12
2021-12-06 values/12
2022-01-06 values/12
2022-02-06 values/12
2022-03-06 values/12
2022-04-06 values/12

成为(N=4,间隔两年)

Date variables
2021-05-06 values/2
2021-11-06 values/2
2022-05-06 values/2
2022-11-06 values/2

感谢您的帮助

【问题讨论】:

    标签: amazon-redshift amazon-athena


    【解决方案1】:

    可能最好的方法是使用递归 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 的值,然后重新运行整个过程即可获得第二个结果。

    【讨论】:

    • 感谢您的帮助我已经探索了这条路,但不确定它是否可行。我在帖子中添加了一些说明,以便更清楚我要做什么。
    • 非常感谢,它有效!!。
    • 德纳达。如果转发就付款。
    猜你喜欢
    • 2020-07-11
    • 2017-10-23
    • 1970-01-01
    • 2015-08-02
    • 2019-03-03
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    相关资源
    最近更新 更多