Abfrage mit komplexer Berechnung

Also hier nochmal mein Ansatz worauf ich hinaus will.

Du hast eine Tabelle (gem. Beispiel jetzt mit 10 Werten). Der Wert vom aktuellen Tag steht immer in wert1, es folgen die Werte der 9 vorangegangenen Tagen. Es gibt aber an jedem Tag einen Datensatz mit diesen Werten, folglich müssten alle 10 Werte in deinem Beispiel auch aus der Spalte wert1 zu ermitteln sein wenn man die 10 aktuellesten Datensätze nimmt.

Hier mal eine Beispieltabelle:
Code:
WITH tabelle(datum,wert1,wert2,wert3,wert4,wert5,wert6,wert7,wert8,wert9,wert10) AS (
SELECT cast('2017-06-19' AS DATE),NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL UNION ALL
SELECT '2017-06-20',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL UNION ALL
SELECT '2017-06-21',75,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL UNION ALL
SELECT '2017-06-22',70,75,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL UNION ALL
SELECT '2017-06-23',56,70,75,NULL,NULL,NULL,NULL,NULL,NULL,NULL UNION ALL
SELECT '2017-06-24',52,56,70,75,NULL,NULL,NULL,NULL,NULL,NULL UNION ALL
SELECT '2017-06-25',51,52,56,70,75,NULL,NULL,NULL,NULL,NULL UNION ALL
SELECT '2017-06-26',50,51,52,56,70,75,NULL,NULL,NULL,NULL UNION ALL
SELECT '2017-06-27',40,50,51,52,56,70,75,NULL,NULL,NULL UNION ALL
SELECT '2017-06-28',37,40,50,51,52,56,70,75,NULL,NULL UNION ALL
SELECT '2017-06-29',34,37,40,50,51,52,56,70,75,NULL UNION ALL
SELECT '2017-06-30',30,34,37,40,50,51,52,56,70,75
   )
SELECT * FROM tabelle
datum wert1 wert2 wert3 wert4 wert5 wert6 wert7 wert8 wert9 wert10
---------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
2017-06-19 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
2017-06-20 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
2017-06-21 75 NULL NULL NULL NULL NULL NULL NULL NULL NULL
2017-06-22 70 75 NULL NULL NULL NULL NULL NULL NULL NULL
2017-06-23 56 70 75 NULL NULL NULL NULL NULL NULL NULL
2017-06-24 52 56 70 75 NULL NULL NULL NULL NULL NULL
2017-06-25 51 52 56 70 75 NULL NULL NULL NULL NULL
2017-06-26 50 51 52 56 70 75 NULL NULL NULL NULL
2017-06-27 40 50 51 52 56 70 75 NULL NULL NULL
2017-06-28 37 40 50 51 52 56 70 75 NULL NULL
2017-06-29 34 37 40 50 51 52 56 70 75 NULL
2017-06-30 30 34 37 40 50 51 52 56 70 75

(12 Zeile(n) betroffen)
Ich hab natürlich nur die Werte befüllt die ich kenne, aber so verstehe ich deine Struktur.

Jetzt könnte man hier recht bequem mit lead() zu jedem Datensatz den Vorgänger und den Vor-Vorgänger holen und deine Berechnung anstellen. Fehlt ein Wert für die Berechnung oder geht ein Wert auf 100 wird die Spalte mit dem berechneten Wert NULL.
Code:
SELECT   TOP 10
     datum,
     wert1,
     (   CASE
       WHEN   wert1 < 100
       AND     lead(wert1,1) OVER (ORDER BY datum DESC) < 100
       AND     lead(wert1,2) OVER (ORDER BY datum DESC) < 100
       THEN   (
           (lead(wert1,1) OVER (ORDER BY datum DESC) - wert1) +
           (lead(wert1,2) OVER (ORDER BY datum DESC) - lead(wert1,1) OVER (ORDER BY datum DESC))
           ) / 2
       ELSE   NULL
       END ) AS mittelwert_aus_differenz
FROM   tabelle
ORDER BY datum DESC
 
Werbung:
Zurück
Oben