Sie wollen also:
- Der Alias
C
um allen Zeilen in der Gruppe für einen bestimmten Tag zu entsprechen, also können SieMAX()
verwenden undMIN()
über die Zeilen in dieser Gruppe. - Der Alias
C2
um der letzten Zeile an einem bestimmten Tag zu entsprechen. - Der Alias
C3
um einer Zeile später alsC2
zu entsprechen am selben Tag. Wenn keine gefunden wird, alsoC3.*
NULL ist, dannC2
ist die neueste an diesem Tag.
Dies wird oft als greatest-n-per-group
bezeichnet Abfrage, und es taucht häufig bei Stack Overflow auf. Hier ist eine Lösung, die ich für Ihre Testdaten getestet habe, aber Sie können dem Tag folgen, das ich Ihrer Frage hinzugefügt habe, um andere Lösungen und Diskussionen zu erhalten.
Bearbeiten: Ich habe die Anforderung sowohl für den Eröffnungspreis als auch für den Schlusspreis verpasst. Folgendes wird bearbeitet.
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;