Функция задержки, чтобы пропустить предыдущую запись, где есть ноль - PullRequest
1 голос
/ 10 июня 2019

Я пытаюсь получить предыдущее значение, используя функцию запаздывания, однако она работает только для данных, заполненных предыдущей записью.То, что я хочу сделать, это пропустить предыдущую запись, только если есть ноль, и посмотреть на предыдущую запись, предшествующую той, которая не является нулевой

Select LAG(previous_reference_no)OVER(ORDER BY createdon) FROM TableA

Так что, если у меня запись 5,4 - ноль, но запись 3 - не ноль.Поэтому из записи 5 я бы хотел отобразить значение записи 4.

Надеюсь, это имеет смысл, пожалуйста, помогите /

Ответы [ 2 ]

1 голос
/ 10 июня 2019

Стандартный SQL имеет синтаксис для этого:

SELECT LAG(previous_reference_no IGNORE NULLS) OVER (ORDER BY createdon)
FROM TableA

К сожалению, SQL Server не поддерживает это. Один метод использует два уровня оконных функций и некоторую логику:

SELECT (CASE WHEN previous_reference_no IS NULL
             THEN MAX(prev_reference_no) OVER (PARTITION BY grp)
             ELSE LAG(previous_reference_no) OVER (PARTITION BY (CASE WHEN previous_reference_no IS NOT NULL THEN 1 ELSE 0 END)
                                                   ORDER BY createdon)
        END)
FROM (SELECT a.*,
             COUNT(prev_reference_no) OVER (ORDER BY a.createdon) as grp
      FROM TableA a
     ) a;

Логика:

  • Создайте группу, которая имеет заданный ссылочный номер и все следующие значения NULL в одной группе.
  • Если ссылочный номер NULL, тогда получите первое значение для начала группы. Это будет предыдущее не NULL значение.
  • Если ссылочный номер не NULL, используйте partition by для просмотра последнего не- NULL значения.

Другой метод, который, вероятно, будет намного медленнее, использует APPLY:

select a.*, aprev.prev_reference_no
from TableA a outer apply
     (select top (1) aprev.*
      from TableA aprev
      where aprev.createdon < a.createdon and
            aprev.prev_reference_no is not null
     ) aprev;

Для небольшой таблицы снижение производительности может стоить простоты кода.

1 голос
/ 10 июня 2019

Добавить предложение PARTITION BY?

Select LAG(previous_reference_no) OVER (PARTITION BY CASE WHEN previous_reference_no IS NULL THEN 0 ELSE 1 END
                                        ORDER BY createdon)
FROM TableA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...