Jadi Anda ingin:
- Alias
C
agar sesuai dengan semua baris dalam grup untuk hari tertentu, jadi Anda dapat menggunakanMAX()
danMIN()
di atas baris dalam grup itu. - Alias
C2
agar sesuai dengan baris terakhir pada hari tertentu. - Alias
C3
untuk berkorespondensi dengan baris setelahC2
di hari yang sama. Jika tidak ada yang ditemukan, mis.C3.*
adalah NULL, makaC2
adalah yang terbaru pada hari itu.
Ini sering diberi label greatest-n-per-group
kueri, dan itu sering muncul di Stack Overflow. Berikut adalah solusi yang saya uji untuk data pengujian Anda, tetapi Anda dapat mengikuti tag yang saya tambahkan ke pertanyaan Anda untuk solusi dan diskusi lainnya.
edit: Saya melewatkan persyaratan untuk harga pembukaan dan harga penutupan. Berikut ini diedit.
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;