Vì vậy, bạn muốn:
- Bí danh
C
tương ứng với tất cả các hàng trong nhóm cho một ngày nhất định, vì vậy bạn có thể sử dụngMAX()
vàMIN()
trên các hàng trong nhóm đó. - Bí danh
C2
tương ứng với hàng cuối cùng trong một ngày nhất định. - Bí danh
C3
tương ứng với một hàng muộn hơnC2
trong cùng một ngày. Nếu không tìm thấy, tức làC3.*
là NULL, sau đó làC2
là thông tin mới nhất vào ngày hôm đó.
Điều này thường được gắn nhãn greatest-n-per-group
và nó xuất hiện thường xuyên trên Stack Overflow. Đây là giải pháp mà tôi đã thử nghiệm cho dữ liệu thử nghiệm của bạn, nhưng bạn có thể theo dõi thẻ tôi đã thêm vào câu hỏi của bạn để biết các giải pháp và thảo luận khác.
chỉnh sửa: Tôi đã bỏ lỡ yêu cầu đối với cả giá mở cửa và giá đóng cửa. Phần sau được chỉnh sửa.
SELECT DATE_FORMAT(C.`DTE`, '%m/%d/%Y') AS trading_day,
MIN(C.`PRICE`) AS min_price,
MAX(C.`PRICE`) AS max_price,
Copen.`PRICE` AS opening_price,
Cclose.`PRICE` AS closing_price
FROM `CHART_DATA` AS C
INNER JOIN `CHART_DATA` AS Cclose
ON DAY(C.`DTE`) = DAY(Cclose.`DTE`)
LEFT OUTER JOIN `CHART_DATA` AS Cclose_later
ON DAY(C.`DTE`) = DAY(Cclose_later.`DTE`) AND Cclose.`DTE` < Cclose_later.`DTE`
INNER JOIN `CHART_DATA` AS Copen
ON DAY(C.`DTE`) = DAY(Copen.`DTE`)
LEFT OUTER JOIN `CHART_DATA` AS Copen_earlier
ON DAY(C.`DTE`) = DAY(Copen_earlier.`DTE`) AND Copen.`DTE` < Copen_earlier.`DTE`
WHERE Cclose_later.`DTE` IS NULL AND Copen_earlier .`DTE` IS NULL
GROUP BY trading_day;