如何解决从范围日期分解为每天高效?
数据具有start_date
和end_date
之类的2020-09-18
和2020-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)
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。