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
Решение, близко до настоящото ви. Има две места, където сте сгрешили.
- FIRST_VALUE И LAST_VALUE са аналитични функции , които работят на прозорец или дял, вместо на група. Можете да изпълните вложената заявка самостоятелно и да видите нейния резултат.
-
LAST_VALUE е последната стойност на текущия прозорец, която не е посочена във вашата заявка, а прозорецът по подразбиране е редовете от първия ред на текущия дял до текущия ред . Можете или да използвате FIRST_VALUE с ред за премахване на зареждане, или да посочите прозорец
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,