按单个日期划分日期范围

时间:2018-11-27 01:18:59

标签: mysql sql snowflake-datawarehouse

我有一个具有以下功能的表:在此期间的发票ID,billing_period_start,billing_period_end和items_purchased。

我希望按单个日期细分日期范围。日期范围可以包含在一个月内,但也可以不相等地分布在两个月内。这将有效创建比表中当前更多的记录。完成此操作后,我需要在日期范围的各个日期之间平均细分购买的商品数量。

billing_period_start      billing_period_end
--------------------      ------------------
2010-03-05                2010-03-07
2010-04-29                2010-05-05
2010-06-29                2006-08-12

billing_date
------------
2010-03-05  
2010-03-06
2010-03-07
2010-04-29
2010-04-30
2010-05-01
   ...
2010-05-05
2010-06-29
2010-06-30
   ...
2010-08-12

现在将日期范围划分为各个日期,我需要将items_purchase除以每个日期在结算周期中的天数,这样我就可以拥有items_purchase_per_date。

select
  invoice_line_id AS invoice_id
  ,items_purchased
  ,billing_period_start
  ,billing_period_end
  ,date_from_parts(YEAR(billing_period_start), MONTH(billing_period_start), 1) AS period1_month_start
  ,last_day(month_start, month) AS period1_month_end
  ,datediff(day, billing_period_start, billing_period_end) + 1 AS billing_period_length
from "INVOICE_DATA"
order by 1;

我正在Snowflake上运行它,但是如果有人知道DBMS更好,则可以轻松地从mySQL转换。

1 个答案:

答案 0 :(得分:0)

在数据仓库中处理此问题的最佳方法是使用date dimension table。也就是说,该表包含您需要分析的所有日期,以及所有有趣的日期属性,例如该日期属于哪个星期/月份/季度等。

一旦您的表中所有相关日期都有唯一的行,您就可以更轻松地解决像这样的日期脊椎挑战。 例如,对于您的情况,您要编写(假设dates是日期维度的名称,而calendar_date是包含唯一日期的列的名称:

select
    d.calendar_date,
    i.*
from
    dates d
    join
    invoice_data i
        on d.calendar_date between i.billing_period_start and i.billing_period_end

现在,每个日期在这些开始/结束日期之间都有一行,您可以进行每日帐单分配。