我在DateRange表中有此数据:
-------------------------------------
DateID FromDate ToDate
-------------------------------------
1 2015/03/21 2015/09/22
2 2015/09/23 2016/09/21
3 2016/09/22 2017/09/22
4 2017/09/23 2018/09/22
5 2018/09/23 2019/09/22
6 2019/09/23 2020/09/21
7 2020/09/22 2021/09/22
...
以及DateValue表中的此数据:
-------------------------
ID DateID Value
-------------------------
1 3 3
2 6 5
这是我需要的结果:
-------------------------
DateID Value
-------------------------
1 0
2 0
3 3
4 3
5 3
6 5
7 5
...
如果没有数据用于范围,请使用0值,并且在2个DateId之间使用相同的值,如果它是最后一个数据值,请使用直到结束
请协助进行SQL查询。我正在使用SQL Server 2016
答案 0 :(得分:3)
尝试一下:
select DateRange.DateId, case when DateValue.Value is null
then
isnull((select top 1 Value from DateValue where DateId < DateRange.DateId
and Value is not null order by DateId desc),0) else Value end as Value
from DateRange left join
DateValue
on DateRange.DateId = DateValue.DateId
答案 1 :(得分:0)
假定您的DateID
与FromDate
升序相同
SELECT r.DateID, Value = COALESCE(v.Value, 0)
FROM DateRange r
OUTER APPLY
(
SELECT TOP 1 x.Value
FROM DateValue x
WHERE x.DateID >= r.DateID
ORDER BY x.DateID
) v
答案 2 :(得分:0)
使用临时表解决此问题 诸如此类:
select Dr.DateID,Dv.Value into #Temp from DateRange Dr left join DateValue Dv on Dr.DateID=Dv.DataId
update #Temp set Value = (select top 1 Values from #Temp t where T.DateID<#Temp.DateID And Value is not null order by DateId desc) where Value is null
UPDATE #Temp SET Value=0 WHERE Value IS NULL
select * from #Temp
我希望做得好