Holen

2016-05-31 18 views
0
die neueste Version eines Produkts

ich eine Tabelle, wo ich Daten eines Produkts (SlobID) eingeben, dieHolen

SELECT  TemplateID, SlobID, FromYear, ToYear, MAX(ValidFrom) AS CurrentDate 
FROM   CommissionsPerTemplate AS CommissionsPerTemplate_1 
GROUP BY TemplateID, SlobID, FromYear, ToYear 
HAVING  (MAX(ValidFrom) <= GETDATE()) AND (TemplateID = 2) AND (SlobID = 743) 

das Ergebnis I erhalten ist

TemplateID SlobID (From Year) (To year) Valid date 
2   743  1   1  2016-01-01 
2   743  1   99  2015-01-01 
2   743  2   99  2016-01-01 

der schwierige Teil ist, dass Wir benötigen eine Abfrage, um die neueste Version dieses Produkts zu erhalten. Die 1. Version (1/1/2015) wenn vom Jahr = 1 bis zum Jahr = 99 aber 2. Version erstellt am (1/1/2016) welche die Jahre vom Jahr 1 bis 1 und vom Jahr 2 bis 99 spaltet.

Also das richtige Ergebnis für mich sollte die folgende

TemplateID SlobID (From Year) (To year) Valid date 
2   743  1   1  2016-01-01 
2   743  2   99  2016-01-01 

aber ich habe sein keine Ahnung, wie dies zu bekommen. Vielleicht sollte die neue Version am 1.1.2017 von Jahr = 1 bis Jahr = 10 und von Jahr = 11 bis Jahr = 99 oder etwas anderem sein.

+3

Ich sehe nichts * extrem fortgeschritten * hier. – Parfait

+0

Ich würde vorschlagen, eine Where-Klausel hinzufügen –

+0

Sie wollen nur den Datensatz 1-99 loswerden? Warum? Was, wenn der 2-99 Rekord wirklich 3-99 war? Dann fehlt dir eine 2-2 Spannweite. Würde die 1-99 Aufzeichnung dann auf ein 2-2 mit einem '2015-01-01' Datum reduziert werden müssen? –

Antwort

0

nicht sicher, ob dies für den Rest der Daten funktionieren wird, aber wenn Sie row_number anstelle von group by verwenden und das "to year" aus Partition herausnehmen, funktioniert es für Ihre Beispieldaten.

select * from 
(
SELECT  TemplateID, SlobID, FromYear, ToYear, ValidFrom As CurrentDate , row_number() over (partition by TemplateID, SlobID,FromYear order by ValidFrom desc) rowid 
FROM   CommissionsPerTemplate AS CommissionsPerTemplate_1 
where (TemplateID = 2) AND (SlobID = 743) 
) as x 
where rowid = 1 
+0

hm !!! es scheint zu funktionieren. aber ich kann die Logik dahinter herausfinden. Ich werde weiter testen und Sie wissen lassen – Yannis

+0

Danke mein Freund, es hat funktioniert. – Yannis