Mysql
 sql >> Database >  >> RDS >> Mysql

Come utilizzare Group By e auto-unirsi per restituire il prezzo minimo, massimo, aperto e chiuso del prezzo giornaliero stabilito?

Quindi vuoi:

  • L'alias C per corrispondere a tutte le righe del gruppo per un determinato giorno, quindi puoi utilizzare MAX() e MIN() 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 a C2 lo stesso giorno. Se non ne viene trovato nessuno, ad es. C3.* è NULL, quindi C2 è 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;