我有一个可以通过递归 CTE 处理的问题,但不是在可接受的时间内。谁能指出我提高性能和/或以不同方式获得相同结果的方法?
这是我的场景!
我有:一个大表,每行包含一个 id、一个开始日期、一个结束日期和一个排名号。每个 id 有多行,日期范围经常重叠。日期从 2010 年开始。
我想要:一个表,其中包含 id + date 的每个组合的行,该行位于上一个表中该 id 的任何日期范围内。每一行都应该具有该 id 和日期的最低排名数字。
例如:
ID Rank Range
1 1 1/1/2010-1/4/2010
1 2 1/2/2010-1/5/2010
2 1 1/1/2010-1/2/2010
变成
ID Rank Day
1 1 1/1/2010
1 1 1/2/2010
1 1 1/3/2010
1 1 1/4/2010
1 2 1/5/2010
2 1 1/1/2010
2 1 1/2/2010
我可以使用递归 CTE 来做到这一点,但性能很糟糕(对于一个相对较小的数据集,它会产生 3100 万行的最终表,需要 20-25 分钟):
with enc(PersonID, EncounterDate, EndDate, Type_Rank) as (
select PersonID, EncounterDate, EndDate, Type_Rank
from Big_Base_Table
union all
select PersonID, EncounterDate + 1, EndDate, Type_Rank
from enc
where EncounterDate + 1 <= EndDate
)
select PersonID, EncounterDate, min(Type_Rank) Type_Rank
from enc
group by PersonID, EncounterDate
;