#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