【问题标题】:Need help to generate time series with defined interval in Redshift需要帮助在 Redshift 中生成具有定义间隔的时间序列
【发布时间】:2019-09-12 20:29:15
【问题描述】:

我有一张表,其中包含开始日期、结束日期和月份间隔。我需要根据将间隔添加到开始日期来生成系列。

例子:

  1. 开始日期 = 2018 年 5 月 1 日,结束日期 = 2019 年 12 月 31 日,间隔 = 2

我正在寻找的系列(日期在行中):7/31/18、9/30/18、11/30/18、... 11/30/19

  1. 开始日期 = 1/1/2018,结束日期 = 12/31/19,间隔 = 3

我正在寻找的系列(日期在行中):3/31/18、6/30/18、9/30/18、12/31/18...12/21/19

详细信息:我有 3 个连接(内部)的表。第一张表有开始日期,第二张表给我给定客户的结束日期,第三张表给我计费频率。基于这 3 个参数,我需要预测多少张发票以及我们将在什么日期为每个客户生成发票。

【问题讨论】:

  • 能否请您澄清一下:您的系列是如何定义的?例如。 “我需要在 之间生成一系列 的每个 月的第二个星期三的日期”。另外:请向我们提供您迄今为止尝试过的代码,以及它给出的输出:)

标签: amazon-redshift


【解决方案1】:

问题不是很清楚,但您可以尝试这样的事情。只需插入您的 start_date、end_date 和 interval。它会给你大部分你想要的东西,然后你可以根据你的具体情况进行定制:

with series as (
    select generate_series(1, datediff(month, <start_date>, <end_date>), 1) as n, MOD(n, <interval>) as remainder
  )
select dateadd(month, n, <start_date>) from series where remainder = 0;

所以一个例子是:

with series as (
    select generate_series(1, datediff(month, '2018-05-01', '2019-12-31'), 1) as n, MOD(n, 3) as remainder
  )
select dateadd(month, n, '2018-05-01') from series where remainder = 0;

【讨论】:

  • 感谢脚本,但问题是我添加基表以获取日期的那一刻,我收到以下错误错误:0A000:Redshift 表不支持指定的类型或函数(每条 INFO 消息一个)。 Redshift 不允许 generate_series 与任何其他表一起使用
  • 我在 Redshift 上运行了该查询,它对我有用。如果您尝试使用它创建一个表,那么它会失败(我不知道为什么,可能是 Redshift 设置了一些限制),尽管加入其他表没有问题。
【解决方案2】:

问题不清楚,但假设要求是to create month end dates between start and end dates with the given interval as months

这种情况下的第一个例子不正确,它应该以6/1/2018而不是5/1/2018开头

我的 SQL 是

WITH params(start_dt, end_date, interval_) AS
(SELECT '2018-06-01'::date,
        '2019-12-31'::date,
        '2'::integer)
, dates AS 
(SELECT ADD_MONTHS(start_dt, n * interval_) - 1 AS dt
  FROM params ,
       (SELECT generate_series(1, ((datediff(month, start_dt::date, end_date::date) / interval_) + 1)) n 
          FROM params) )
SELECT to_char(dt,'MM/DD/YY') dt
  FROM dates, params
 WHERE dt BETWEEN start_dt AND end_date

这个的输出是

dt
07/31/18
09/30/18
11/30/18
01/31/19
03/31/19
05/31/19
07/31/19
09/30/19
11/30/19

第二个例子

WITH params(start_dt, end_date, interval_) AS
(SELECT '2018-01-01'::date,
        '2019-12-31'::date,
        '3'::integer)
, dates AS 
(SELECT ADD_MONTHS(start_dt, n * interval_) - 1 AS dt
  FROM params ,
       (SELECT generate_series(1, ((datediff(month, start_dt::date, end_date::date) / interval_) + 1)) n 
          FROM params) )
SELECT to_char(dt,'MM/DD/YY') dt
  FROM dates, params
 WHERE dt BETWEEN start_dt AND end_date

输出是

dt
03/31/18
06/30/18
09/30/18
12/31/18
03/31/19
06/30/19
09/30/19
12/31/19

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多