按日期划分日期范围

cclgggtu  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(349)

我有一个具有以下特性的表:发票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转换。

slsn1g29

slsn1g291#

在数据仓库中处理此问题的最佳方法是使用日期维度表。也就是说,一个包含所有分析所需日期的表,以及任何有趣的日期属性,例如日期所属的周/月/季度等。
一旦您有了一个表,其中包含了所有相关日期的唯一行,您就可以更轻松地处理像这样的日期脊椎挑战。例如,对于你的案例,你会写(假设 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

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

相关问题