Сравнение строк текущего и предыдущего месяцев в столбце SQL Server 2012
мне нужно руководство и помощь с вопросом, который я не совсем уверен, как решить в SQL Server 2012. Я думаю LAG
и LEAD
функции могут быть полезны, но я не уверен.
это то, что мои данные выглядят прямо сейчас:
=========================================
YearMonth LocationCode Active
=========================================
201405 123 0
201406 123 2
201409 211 1
201410 211 0
201411 214 0
201412 214 3
у нас есть YearMonth
столбец, который показывает, как выглядел статус для каждого locationCode
и Active
int, который представляет качество для каждого LocationCode
цель:
мой цель-сравнить LocationCode
в течение YearMonth
(назовем его 201406
) и (назовем его 201405
):
пример :
=========================================
YearMonth LocationCode Active
=========================================
201405 123 0
201406 123 2
в основном я пытаюсь выяснить, как сравнить строку текущего месяца (201406) с строкой предыдущего месяца (201405) в столбце под названием Active
.
если строка текущего месяца Active
столбец является ненулевым, а актив предыдущего месяца был равен нулю, тогда мы завершите строку текущего месяца как " New " (1) else (0).
пример приведен ниже:
==================================================
YearMonth LocationCode Active New
===================================================
201405 123 0 0
201406 123 2 1
201409 211 1 0
201410 211 0 0
201411 214 0 0
201412 214 3 1
как я могу решить эту проблему?
2 ответов
Я думаю, вы можете использовать такой запрос:
SELECT *,
CASE
WHEN Active <> 0 AND
ISNULL(LAG(Active) OVER (PARTITION BY LocationCode ORDER BY YearMonth), 0) = 0 THEN 1
ELSE 0
END As New
FROM yourTable;
Вы можете сделать это с помощью ROW_NUMBER() OVER
такой:
WITH RankedCodesHistory AS (
SELECT
YearMonth,
LocationCode,
Active,
ROW_NUMBER() OVER (PARTITION BY LocationCode, CASE WHEN Active > 0 THEN 1 ELSE 0 END
ORDER BY LocationCode, YearMonth, Active) rn
FROM CodesHistory)
SELECT
YearMonth,
LocationCode,
Active,
CASE WHEN Active > 0 AND rn = 1 THEN 1 ELSE 0 END AS New
FROM RankedCodesHistory
я расширил ваш образец данных в скрипке, чтобы продемонстрировать, что произойдет, если Active вернется к нулю и станет положительным во второй раз --- в этом случае код выше не будет устанавливать соответствующую строку как новую.