Quindi vuoi:
- L'alias
C
per corrispondere a tutte le righe del gruppo per un determinato giorno, quindi puoi utilizzareMAX()
eMIN()
sulle righe di quel gruppo. - L'alias
C2
per corrispondere all'ultima riga in un determinato giorno. - L'alias
C3
per corrispondere a una riga successiva aC2
lo stesso giorno. Se non ne viene trovato nessuno, ad es.C3.*
è NULL, quindiC2
è l'ultima di quel giorno.
Questo è spesso etichettato come greatest-n-per-group
query e viene visualizzato frequentemente su Stack Overflow. Ecco una soluzione che ho testato per i tuoi dati di test, ma puoi seguire il tag che ho aggiunto alla tua domanda per altre soluzioni e discussioni.
modifica: Ho mancato il requisito sia per il prezzo di apertura che per il prezzo di chiusura. Quanto segue è modificato.
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;