Сравнение строк текущего и предыдущего месяцев в столбце 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;

[SQL Fiddle Demo]


Вы можете сделать это с помощью 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

SQL Fiddle

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