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 soluzione vicina a quella attuale. Ci sono due posti in cui hai sbagliato.
- FIRST_VALUE E LAST_VALUE sono Funzioni analitiche , che funzionano su una finestra o una partizione, invece che su un gruppo. Puoi eseguire la query nidificata da sola e vederne il risultato.
-
LAST_VALUE è l'ultimo valore della finestra corrente, che non è specificato nella query, e una finestra predefinita è costituita dalle righe dalla prima riga della partizione corrente alla riga corrente . Puoi utilizzare FIRST_VALUE con l'ordine di rimozione del seme o specificare una finestra
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,