Выделите отсутствующие последующие платежи SQL Server

#sql #tsql #sql-server-2016

Вопрос:

Я пытаюсь найти способ создать запрос, в котором будет указано, последовала ли ожидаемая транзакция за платежом в SQL Server 2016.

Данные, которыми я располагаю, примерно

 SELECT 123456 AS Casekey
        , 1 as rnk
        , NULL AS LAPayment
        , 1080.00 AS LAReserve
UNION ALL
SELECT 123456 AS Casekey
        , 2 as rnk
        , 1080.00 AS LAPayment
        , null AS LAReserve
UNION ALL
SELECT 123456 AS Casekey
        , 3 as rnk
        , NULL AS LAPayment
        , NULL AS LAReserve
 

Должно быть последующее сохранение 0 после LAPayment, однако этого нет — мне нужно подчеркнуть, когда это происходит — по сути, платеж уменьшил резерв до 0, но способ настройки системы 0 вводится в экран транзакции, и данные должны отражать систему — это, к сожалению, вне моего контроля!

Комментарии:

1. Можете ли вы добавить ожидаемый результат, чтобы устранить проблему, пожалуйста?

Ответ №1:

Для этого вы можете использовать функцию LEAD окна

 SELECT *
FROM (
    SELECT *,
      NextLAReserve = LEAD(LAReserve) OVER (PARTITION BY Casekey ORDER BY rnk)
    FROM YourTable t
) t
WHERE t.LAPayment > 0 AND t.NextLAReserve IS NULL;
 

Ответ №2:

В этом полезны функции Windows. В этой проблеме вам может понадобиться функция LAG() или LEAD (). Приведенный выше ответ @Charlieface дает ПРЕИМУЩЕСТВО (), а это дает ОТСТАВАНИЕ()

В этом случае можно использовать функцию окна LAG (). Лучше указать ожидаемый результат, чтобы результат можно было проверить перед публикацией.

 SELECT Casekey
 , rnk
 , LAPayment
 , CASE WHEN LAG(LAPayment) over (order by Casekey)   is not null then  0 ELSE LAReserve END  AS LAReserve  
  FROM
  (SELECT 123456 AS Casekey
     , 1 as rnk
     , NULL AS LAPayment
     , 1080.00 AS LAReserve
    UNION ALL
   SELECT 123456 AS Casekey
      , 2 as rnk
      , 1080.00 AS LAPayment
      , null AS LAReserve
    UNION ALL
   SELECT 123456 AS Casekey
      , 3 as rnk
      , NULL AS LAPayment
      , NULL AS LAReserve
    ) AS A
 

Результат