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
Une solution proche de votre actuelle. Il y a deux endroits où vous vous êtes trompé.
- FIRST_VALUE ET LAST_VALUE sont des fonctions analytiques , qui fonctionnent sur une fenêtre ou une partition, au lieu d'un groupe. Vous pouvez exécuter la requête imbriquée seule et voir son résultat.
-
LAST_VALUE est la dernière valeur de la fenêtre actuelle, qui n'est pas spécifiée dans votre requête, et une fenêtre par défaut est constituée de lignes allant de la première ligne de la partition actuelle à la ligne actuelle . Vous pouvez soit utiliser FIRST_VALUE avec l'ordre d'épandage, soit spécifier une fenêtre
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,