Найти и сгенерировать значение для некоторого диапазона дат - PullRequest
3 голосов
/ 07 апреля 2019

У меня есть эти данные в таблице 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 ]

3 голосов
/ 07 апреля 2019

Попробуйте это:

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
0 голосов
/ 07 апреля 2019

использовать временную таблицу для решения этой проблемы примерно так:

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

Я надеюсь, что это хорошо

0 голосов
/ 07 апреля 2019

предполагается, что ваш 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...