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
Một giải pháp gần với giải pháp hiện tại của bạn. Có hai chỗ bạn đã làm sai.
- FIRST_VALUE VÀ LAST_VALUE là Hàm phân tích , hoạt động trên một cửa sổ hoặc phân vùng, thay vì một nhóm. Bạn có thể chạy một mình truy vấn lồng nhau và xem kết quả của nó.
-
LAST_VALUE là giá trị cuối cùng của cửa sổ hiện tại, không được chỉ định trong truy vấn của bạn và cửa sổ mặc định là các hàng từ hàng đầu tiên của phân vùng hiện tại đến hàng hiện tại . Bạn có thể sử dụng FIRST_VALUE với thứ tự giảm dần hoặc chỉ định một cửa sổ
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,