Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Verwendung von GROUP BY mit FIRST_VALUE und LAST_VALUE

SELECT 
    MIN(MinuteBar) AS MinuteBar5,
    Opening,
    MAX(High) AS High,
    MIN(Low) AS Low,
    Closing,
    Interval
FROM 
(
    SELECT FIRST_VALUE([Open]) OVER (PARTITION BY DATEDIFF(MINUTE, '2015-01-01 00:00:00', MinuteBar) / 5 ORDER BY MinuteBar) AS Opening,
           FIRST_VALUE([Close]) OVER (PARTITION BY DATEDIFF(MINUTE, '2015-01-01 00:00:00', MinuteBar) / 5 ORDER BY MinuteBar DESC) AS Closing,
           DATEDIFF(MINUTE, '2015-01-01 00:00:00', MinuteBar) / 5 AS Interval,
           *
    FROM #MinuteData
) AS T
GROUP BY Interval, Opening, Closing

Eine Lösung, die Ihrer aktuellen nahe kommt. An zwei Stellen hast du einen Fehler gemacht.

  1. FIRST_VALUE UND LAST_VALUE sind Analysefunktionen , die auf einem Fenster oder einer Partition statt auf einer Gruppe funktionieren. Sie können die verschachtelte Abfrage alleine ausführen und das Ergebnis anzeigen.
  2. LAST_VALUE ist der letzte Wert des aktuellen Fensters, der nicht in Ihrer Abfrage angegeben ist, und ein Standardfenster sind Zeilen von der ersten Zeile der aktuellen Partition bis aktuelle Zeile . Sie können entweder FIRST_VALUE mit der Entfernungsreihenfolge verwenden oder ein Fenster angeben

    LAST_VALUE([Close]) OVER (PARTITION BY DATEDIFF(MINUTE, '2015-01-01 00:00:00', MinuteBar) / 5 
                ORDER BY MinuteBar 
                ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS Closing,