2017-05-26 4 views
1

Da ich mit einem ziemlich großen Datensatz arbeite, suche ich nach einem effizienteren Weg, um frühere Werte basierend auf einer Datumssequenz zu erhalten. Ich bin derzeit eine SELECT TOP 1 Sub-Abfrage für jeden Wert, aber das braucht viel Zeit, um jedes Mal, wenn ich die AbfrageEffizienter vorheriger Wert mit SQL

Beispieldaten ausführen:

TDate  Object Price  Volume 
18.05.2017 ObjectA  105  10 
18.05.2017 ObjectB  110  10 
18.05.2017 ObjectC  120  10 
19.05.2017 ObjectA  100  12 
19.05.2017 ObjectB  75  10 
19.05.2017 ObjectD  33  10 
22.05.2017 ObjectA  105  15 
22.05.2017 ObjectB  80  10 
22.05.2017 ObjectD  55  10 

Mein Code:

SELECT TDate AS TodaysDate, Object, Price AS TodaysPrice, Volume AS TodaysVolume, 
(SELECT TOP 1 TDate 
           FROM Table1 AS P2 
           WHERE P2.Object = Table1.Object 
           AND P2.TDate < Table1.TDate 
           ORDER BY P2.TDate DESC) As prevDate, 
(SELECT TOP 1 Price 
           FROM Table1 AS P2 
           WHERE P2.Object = Table1.Object 
           AND P2.TDate < Table1.TDate 
           ORDER BY P2.TDate DESC) As prevPrice, 
(SELECT TOP 1 Volume 
           FROM Table1 AS P2 
           WHERE P2.Object = Table1.Object 
           AND P2.TDate < Table1.TDate 
           ORDER BY P2.TDate DESC) As PrevVolume 
FROM Table1 

Ausgang:

TodaysDate Object TodaysPrice TodaysVolume prevDate prevPrice PrevVolume 
18.05.2017 ObjectA  105  10   
18.05.2017 ObjectB  110  10   
18.05.2017 ObjectC  120  10   
19.05.2017 ObjectA  100  12    18.05.2017  105  10 
19.05.2017 ObjectB  75  10    18.05.2017  110  10 
19.05.2017 ObjectD  33  10   
22.05.2017 ObjectA  105  15    19.05.2017  100  12 
22.05.2017 ObjectB  80  10    19.05.2017  75  10 
22.05.2017 ObjectD  55  10    19.05.2017  33  10 

Der Ausgang ist richtig, aber ich würde sehr Eingang auf zwei Dinge zu schätzen wissen;

1) Gibt es eine Möglichkeit, frühere Daten und Werte effizienter zu berechnen? (Ich verwende Microsoft Access 2010)

2) Wie kann ich den Preisunterschied zwischen TodaysPrice und PrevPrice direkt in den SQL-Code einbeziehen?

Vielen Dank im Voraus für jede Beratung und Eingabe!

+0

Ist PrevDate immer genau einen Monat vor TodaysDate? – AVG

+0

Nein - leider gibt es kein Muster in den Daten. PrevDate ist das vorherige Datum, an dem das Objekt in der Tabelle aufgeführt wird (d. H. Wenn es über ein Wochenende ist, ist der vorherige Tag der letzte Freitag) – user3777079

Antwort

1

können Sie verwenden Unterabfrage

SELECT TodaysDate, TodaysObject, TodaysPrice, TodaysVolume, Today.PrevDate, 
    prev.Price as PrevPrice, prev.Volume as PrevVolume 
FROM (
    SELECT TDate AS TodaysDate, Object as TodaysObject, Price AS TodaysPrice, Volume AS TodaysVolume, 
     Table1.Object, (SELECT MAX(P2.TDate) 
           FROM Table1 AS P2 
           WHERE P2.Object = Table1.Object 
           AND P2.TDate < Table1.TDate) As PrevDate 
    FROM Table1) Today 
    LEFT JOIN Table1 as Prev ON Today.TodaysObject= Prev.Object AND Today.PrevDate = Prev.TDate 
+0

Danke für die Eingabe! Der von Ihnen bereitgestellte Code funktioniert nicht wie er ist, aber ich werde versuchen herauszufinden, warum. – user3777079

+0

Fügen Sie dem Objektfeld der Unterabfrage einen Alias ​​hinzu, z. 'SELECT TDate AS TodayDate, Objekt AS TodayObject, Preis AS TodaysPrice, ...' – Pasetchnik

Verwandte Themen