我有一个具有以下特性的表:发票id、帐单期开始、帐单期结束和在该期间购买的项目。
我想按每个日期划分一个日期范围。日期范围可以包含在一个月内,但也可以不相等地分布在两个月内。这将有效地创建比表中当前更多的记录。一旦我做到了这一点,我需要打破的金额购买项目之间的日期范围平均。
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
现在,日期范围被分解为单独的日期,我需要将购买的项目除以每个日期的计费周期天数,这样我就有了每个日期购买的项目。
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条答案
按热度按时间gt0wga4j1#
在数据仓库中处理此问题的最佳方法是使用日期维度表。也就是说,一个包含所有分析所需日期的表,以及任何有趣的日期属性,例如日期所属的周/月/季度等。
一旦您有了一个表,其中包含了所有相关日期的唯一行,您就可以更轻松地处理像这样的日期脊椎挑战。例如,对于你的案例,你会写(假设
dates
是日期维度的名称和calendar_date
包含唯一日期的列的名称:现在,在这些开始/结束日期之间,每个日期有一行,您可以进行每日帐单分配。