从范围日期分解为每天高效?

问题描述

数据具有start_dateend_date之类的2020-09-182020-09-28。我需要将其细分为每天11天,包括2020-09-18

我的解决方案是每天创建一个日期表。

with cte as(
select b.fulldate,count(1) over (partition by a,b,metric_c,metric_d) as count,a,metric_d
from a 
join dim_date b
    on b.fulldate between a.start_date and a.end_date
)
select 
    fulldate,metric_c / count as metric_c,--maybe some cast or convert in here
    metric_d / count as metric_d
from cte

这是我目前正在使用的。但是,有没有更有效的方法呢?如果表中有1,000,000行,也许有10个度量,那么如何获得更好的性能

还是要多谢。也许有些方法不需要使用额外的日期表(如果那里没有足够的日期,则需要进行一些更新),并且具有处理数百万个数据的出色性能。如果没有,那么我将继续使用我的方法

解决方法

我将保留您拥有的dim_date数据模型,因为它已经实现了start_dates和end_dates之间的行。

表DIM_DATE是一个已确认维度的示例,它可用于报表应用程序中任何需要日期维度的其他主题领域。

我会检查在您的DIM_DATE中是否有要查找的键的索引(b.full_date)。

,

如果您有很多日期和相对较短的时间,那么如果递归子查询具有更好的性能,我不会感到惊讶:

with cte as (
      select start_date,end_date,metric_a / (datediff(day,start_date,end_date) + 1) as metric_a,metric_b / (datediff(day,end_date) + 1) as metric_b
      from a
      union all
      select dateadd(day,1,start_date),metric_a,metric_b
      from cte
      where start_date < end_date
     )
select *
from cte;

您可以根据需要向CTE添加更多指标。

如果任何期限超过100天,则需要添加option (maxrecursion 0)