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
Una solución cercana a la actual. Hay dos lugares en los que hiciste mal.
- FIRST_VALUE Y LAST_VALUE son Funciones analíticas , que funcionan en una ventana o partición, en lugar de un grupo. Puede ejecutar la consulta anidada solo y ver su resultado.
-
LAST_VALUE es el último valor de la ventana actual, que no se especifica en su consulta, y una ventana predeterminada son las filas desde la primera fila de la partición actual hasta la fila actual . Puede usar FIRST_VALUE con orden de inicialización o especificar una ventana
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,