【问题标题】:Creating a transactional result set from subscription start/end dates从订阅开始/结束日期创建事务结果集
【发布时间】:2021-04-21 19:33:03
【问题描述】:

问题:我有一个包含订阅信息的表格,例如:

订阅 ID、间隔(每月/每年)、开始日期、结束日期

在 SQL 中为这些订阅创建一个时间序列的续订直到其结束日期的最佳方法是什么(首选 Snowflake)?

我最初尝试从日期中提取日期,并认为续订日期是每月订阅的那一天,以及年度订阅的同一个月和同一天。存在闰年的问题,或者如果订阅者在 2021 年 1 月 31 日购买,那么 2021 年 2 月 31 日不存在。

我还有一个“日期”表可供我使用,其中有 1 列的日期从 1970 年到 2080 年。

Example:

ID   Interval   Start Date  End Date
123  Monthly    1/30/2021   5/14/2021
456  Annual     3/24/2018   2/14/2021

Result Output:

ID:   Interval: Transaction_Date:
123   Monthly   1/30/2021
123   Monthly   2/28/2021
123   Monthly   3/30/2021
123   Monthly   4/30/2021
456   Annual    3/24/2018
456   Annual    3/24/2019
456   Annual    3/24/2020

感谢您的帮助!

【问题讨论】:

  • 正确标记你的数据库,它不能同时是两个
  • 数字/计数表的理想用例。
  • @stu 您能否快速解释一下如何使用数字/计数表来查找相应的日期值?

标签: sql snowflake-cloud-data-platform


【解决方案1】:

在 Postgres 中,您可以使用 generate_series() 完成此操作

select s.id, g.transaction_date::date
from subscriptions s
  cross join generate_series(s.start_date, s.end_date, 
                             case 
                                 when "interval" = 'Monthly' then interval '1 month' 
                                 else interval '1 Year' 
                             end) as g(transaction_date)
order by s.id, g.transaction_date

但是,这并不能完全返回您想要的结果,因为 2021-02-28 之后的日期也是 28 日。但也许这样就足够了?

|id  | transaction_date|
|----|-----------------|
|123 | 2021-01-30      |
|123 | 2021-02-28      |
|123 | 2021-03-28      |
|123 | 2021-04-28      |
|456 | 2018-03-24      |
|456 | 2019-03-24      |
|456 | 2020-03-24      |

【讨论】:

  • 是的,不幸的是,交易日期现在重置为每月 28 日。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-20
  • 1970-01-01
  • 1970-01-01
  • 2021-06-02
  • 1970-01-01
相关资源
最近更新 更多