Så du vill:
- Aliaset
C
för att motsvara alla rader i gruppen för en viss dag, så att du kan användaMAX()
ochMIN()
över raderna i den gruppen. - Aliaset
C2
för att motsvara den sista raden på en viss dag. - Aliaset
C3
för att motsvara en rad senare änC2
på samma dag. Om ingen hittas, dvsC3.*
är NULL, sedanC2
är den senaste den dagen.
Detta märks ofta som en greatest-n-per-group
fråga, och den dyker upp ofta på Stack Overflow. Här är en lösning som jag testade för dina testdata, men du kan följa taggen jag lade till i din fråga för andra lösningar och diskussioner.
redigera: Jag missade kravet på både öppningskurs och stängningskurs. Följande är redigerat.
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;