2015-08-09 17 views
5

Ich brauche einige Anleitung und Hilfe mit einer Frage Ich bin nicht ganz sicher, wie in SQL Server 2012 zu lösen. Ich denke, LAG und LEAD Funktionen könnten nützlich sein, aber ich bin nicht sicher.Vergleichen der aktuellen Monat und vorherigen Monat Zeilen in einer Spalte, SQL Server 2012

Dies ist, was jetzt meine Daten aussieht:

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

Wir haben eine YearMonth Spalte, die zeigt, wie der Status für jeden locationCode aussah und ein Active int, die für jede LocationCode

eine Qualität darstellt Ziel:

Mein Ziel ist es, die LocationCode für für die Währung zu vergleichen ent YearMonth (nennen wir es 201406) und der vorherigen Yearmonth (lassen 201405 es nennen):

Ein Beispiel:

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

Im Grunde, was ich versuche, herauszufinden, wie die aktuelle Monat Zeile vergleichen (201406) in die Zeile des Vormonats (201405) auf der Spalte Active.

Wenn die Spaltedes aktuellen Monats nicht Null ist und der aktive Wert des vorherigen Monats Null war, schließen wir die Zeile des aktuellen Monats als "Neu" (1) else (0) ab.

Ein Beispiel ist unten angegeben:

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

Wie kann ich dieses Problem lösen?

+0

Ich habe eine Reihe von Variationen über ROW_NUMBER() sucht zum ersten Mal die Zeile und Active Null und die zweite Reihe wurde ein Nicht-Null-Wert, aber es kam nicht richtig, wie in vielen Fällen. Da der Aktive in einem Monat 1 sein konnte und andere nicht, ist mir deshalb ein Vergleich zwischen dem aktuellen und dem vorherigen Monat wichtig. – user3197575

Antwort

2

denke ich, Sie eine Abfrage wie folgt verwendet werden:

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

Hast du das getestet?Sieht aus wie einige Bedingungen sollten umgekehrt werden. – Bulat

+0

Ja, definitiv Bedingungen sollten umgekehrt werden) – Bulat

+0

@Bulat Hoppla, ich habe es, Danke;). –

1

Sie können dies wie folgt mit ROW_NUMBER() OVER tun:

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

Ich habe Ihre Datenprobe in der Fiddle erweitert zu zeigen, was passieren wird, wenn Active wieder auf Null geht und wird positiv zweiten Mal --- In diesem Fall Code oben wird nicht die entsprechende Zeile als neu gesetzt.

+1

Vielen Dank für Ihren Vorschlag.Sind Sie der Meinung, dass es einen Weg gibt, die LAG- und LEAD-Funktion für dieses Problem zu implementieren? Ihre Lösung ist gut, aber das Problem auf meiner Seite ist, dass ich viele Millionen Zeilen haben werde. Aus diesem Grund bin ich daran interessiert, nur zwei Monate zu vergleichen, die Spalte des Vormonats mit der des aktuellen Monats. Ich mag deine Lösung, weil sie mehr Einblick gibt, wie ich andere Probleme mit deiner Strategie lösen kann. Danke Bulat. – user3197575

+0

jetzt @ shA.t aktualisiert seine Antwort mit korrekten Bedingungen, funktioniert es für Sie? – Bulat