查找并生成某个范围日期的值

时间:2019-04-07 07:32:59

标签: sql sql-server

我在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

3 个答案:

答案 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)

假定您的DateIDFromDate升序相同

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

我希望做得好