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
Rozwiązanie zbliżone do Twojego obecnego. Są dwa miejsca, w których popełniłeś błąd.
- PIERWSZA_WARTOŚĆ I LAST_WARTOŚĆ to Funkcje analityczne , które działają na oknie lub partycji, a nie na grupie. Możesz uruchomić samodzielnie zagnieżdżone zapytanie i zobaczyć jego wynik.
-
LAST_VALUE to ostatnia wartość bieżącego okna, która nie jest określona w zapytaniu, a okno domyślne to wiersze od pierwszego wiersza bieżącej partycji do bieżącego wiersza . Możesz użyć FIRST_VALUE z kolejnością usuwania pozycji lub określić okno
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,