2017-12-20 2 views
0

Ich habe eine Tabelle, die in der Struktur analog zu der unten definierten Tabelle ist. Die PK ist die erste 4 Spalten, die letzte Spalte ist die tatsächliche Punktzahl. Jede Zeile wird vollständig mit den 12 Monaten des Geschäftsjahres ausgefüllt. Die Punkte werden so ausgefüllt, wie sie in diesem Monat verfügbar sind. Jeden Monat möchten wir darüber berichten, was der letzte verfügbare Score ist (einige Werte liegen hinter einem oder zwei Monaten zurück, so dass wir den aktuellen Monat nicht verwenden können) und was der vorherige war. In Anbetracht der unten angegebenen Daten geliefert, würde ich wie die Ergebnisse als solche erscheinen:Wählen Sie den Monat mit den letzten verfügbaren Daten und dem vorherigen Monat

+--------+--------+--------+-----------+----------+---------------+ 
|ScoreKey|DeptName|TestName|ScorePeriod|ScoreValue|CurrentPrevious| 
+--------+--------+--------+-----------+----------+---------------+ 
| 1 | 'abc' | 'def' | 201707 | 1  | Current  | 
| 1 | 'abc' | 'def' | NULL  | NULL | Previous | 
| 2 | 'abc' | 'def' | 201801 | 7  | Current  | 
| 2 | 'abc' | 'def' | 201712 | 6  | Previous | 
+--------+--------+--------+-----------+----------+---------------+ 

ich versuchte dabei einen GROUP BY mit MAX() dann UNION und auszufiltern den MAX Wert aber das Konto nicht für diejenigen mit nur einer Reihe von Daten (es gibt keine Zeile zurück).

-Code die Tabelle und Werte bieten:

create table #scores (
     ScoreKey INT, 
     DeptName VARCHAR(10), 
     TestName VARCHAR(10), 
     ScorePeriod INT, 
     ScoreValue INT 
    ) 

    insert into #scores values (1,'abc','def',201707,1) 
    insert into #scores values (1,'abc','def',201708,NULL) 
    insert into #scores values (1,'abc','def',201709,NULL) 
    insert into #scores values (1,'abc','def',201710,NULL) 
    insert into #scores values (1,'abc','def',201711,NULL) 
    insert into #scores values (1,'abc','def',201712,NULL) 
    insert into #scores values (1,'abc','def',201801,NULL) 
    insert into #scores values (1,'abc','def',201802,NULL) 
    insert into #scores values (1,'abc','def',201803,NULL) 
    insert into #scores values (1,'abc','def',201804,NULL) 
    insert into #scores values (1,'abc','def',201805,NULL) 
    insert into #scores values (1,'abc','def',201806,NULL) 
    insert into #scores values (2,'abc','def',201707,1) 
    insert into #scores values (2,'abc','def',201708,3) 
    insert into #scores values (2,'abc','def',201709,4) 
    insert into #scores values (2,'abc','def',201710,5) 
    insert into #scores values (2,'abc','def',201711,5) 
    insert into #scores values (2,'abc','def',201712,6) 
    insert into #scores values (2,'abc','def',201801,7) 
    insert into #scores values (2,'abc','def',201802,NULL) 
    insert into #scores values (2,'abc','def',201803,NULL) 
    insert into #scores values (2,'abc','def',201804,NULL) 
    insert into #scores values (2,'abc','def',201805,NULL) 
    insert into #scores values (2,'abc','def',201806,NULL) 

Antwort

0
select * 
from 
(select * 
     , row_number over (partition by ScoreKey, DeptName, TestName order by ScorePeriod desc) as rn 
    from table 
) aa 
where rn <= 2 
Verwandte Themen