обновление нулевых данных предыдущим захваченным значением - PullRequest
0 голосов
/ 16 октября 2019

У меня есть таблица " childdataviewdetail " с полями " code ", " updateon " и " height ".

  • " Код " представляет код ребенка;
  • " Updateon " - это дата, когда мы принимаем рост этого ребенка (обычно мыпринимайте его раз в месяц);
  • " высота " - рост ребенка.

У нас около 10000 детей. Много раз мы забываем принять их высоту, чтобы они захватывали ноль для того же самого. Мне нужен запрос для обновления нулевого значения последним значением, принятым до этого дня.

Я написал код, который работает нормально, но это занимает слишком много времени. Мне нужно знать, есть ли другой возможный способ сделать это быстро.

select
 code,
 updateon,
 iif(height is null, 
    (select top 1 height              
     from childdataviewdetail
     where code = t1.code 
            and updateon<=t1.updateon 
            and height is not null
     order by updateon desc)
    ,height) height
from childdataviewdetail t1
order by code, updateon

Я получаю ожидаемый результат, но выполнение запроса занимает много времени. Пожалуйста, предложите любую альтернативу.

1 Ответ

0 голосов
/ 16 октября 2019

Использовать оконные функции. Однако вы, похоже, хотите lag(ignore nulls), который SQL Server не поддерживает. Один метод - это два уровня оконных функций:

select cdvd.*,  -- whatever columns you want here
       coalesce(height,
                max(height) over (partition by code, grp)
               ) as height
from (select cdvd.*,
             count(height) over (partition by code order by updateon) as grp
      from childdataviewdetail cdvd
     ) cdvd
order by code, updateon;

Если height никогда не уменьшается, то вы можете использовать совокупный max(), который проще:

select cdvd.*,  -- whatever columns you want here
       coalesce(height,
                max(height) over (partition by code order by updatedon)
               ) as height
from childdataviewdetail cdvd
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...