我有一个具有以下功能的表:在此期间的发票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转换。
答案 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
现在,每个日期在这些开始/结束日期之间都有一行,您可以进行每日帐单分配。