2015-08-09 13 views
5

Potrzebuję wskazówek i pomocy w kwestii Nie jestem całkowicie pewien, jak rozwiązać w SQL Server 2012. Myślę, że funkcje LAG i LEAD mogą być przydatne, ale ja nie jestem pewien.Porównywanie wierszy bieżącego miesiąca i poprzedniego miesiąca na kolumnie, SQL Server 2012

To co moje dane wygląda teraz:

========================================= 
YearMonth LocationCode Active  
========================================= 
201405  123    0 
201406  123    2 
201409  211    1 
201410  211    0 
201411  214    0 
201412  214    3 

Mamy kolumnę YearMonth, który pokazuje w jaki sposób stan wyglądało dla każdego locationCode i Active int który reprezentuje jakość dla każdego LocationCode

Cel:

Moim celem jest porównanie LocationCode dla curra ent YearMonth (nazwijmy go 201406) i poprzedni Yearmonth (nazwijmy go 201405):

przykład:

========================================= 
YearMonth LocationCode Active  
========================================= 
201405  123    0 
201406  123    2 

Zasadniczo co próbuję dowiedzieć się, jest jak porównać bieżącą miesiąc wiersz (201406) do wiersza z poprzedniego miesiąca (201405) na kolumnie o nazwie Active.

Jeśli kolumna z wiersza bieżącego miesiąca jest niezerowa, a wartość Aktywna z poprzedniego miesiąca wynosiła zero, wówczas wiersz z bieżącego miesiąca kończy się na "Nowy" (1) inny (0).

Przykład znajduje się poniżej:

================================================== 
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 

Jak mogę rozwiązać ten problem?

+0

Mam szereg wariacji na ROW_NUMBER() szukających po raz pierwszy wiersz i Active wynosiła zero, a drugi wiersz będący niezerowa, ale nie poprawiła się, jak w wielu przypadkach. Ponieważ aktywny może być 1 w ciągu pewnego miesiąca, a inny nie, dlatego interesuję się techniką porównawczą na bieżący i poprzedni miesiąc. – user3197575

Odpowiedz

2

myślę, że można użyć kwerendy tak:

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]

+0

Czy to przetestowałeś?Wygląda na to, że niektóre warunki powinny zostać odwrócone. – Bulat

+0

Tak, zdecydowanie warunki powinny zostać odwrócone) – Bulat

+0

@ Bulat Ooops, mam to, dzięki;). –

1

Można to zrobić z ROW_NUMBER() OVER tak:

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

mam rozszerzony swoją próbkę danych w Fiddle do wykazania, co się stanie, jeśli aktywny wraca do zera i staje się dodatni po raz drugi --- w tym przypadku powyższy kod nie ustawi odpowiedniego wiersza jako nowego.

+1

Dziękuję za sugestię. Czy uważasz, że istnieje sposób na wdrożenie funkcji LAG i LEAD dla tego problemu? Twoje rozwiązanie jest dobre, jednak moim problemem jest to, że będę miał wiele milionów wierszy. Właśnie dlatego interesuje mnie porównanie dwóch miesięcy, kolumny z poprzedniego miesiąca z rekordem z bieżącego miesiąca. Podoba mi się twoje rozwiązanie, ponieważ pozwoliło mi to lepiej zrozumieć, jak mogę rozwiązać inne problemy związane ze strategią. Dziękuję, Bulat. – user3197575

+0

teraz @ shA.t zaktualizował swoją odpowiedź z poprawnymi warunkami, czy to działa dla Ciebie? – Bulat