Dus je wilt:
- De alias
C
om overeen te komen met alle rijen in de groep voor een bepaalde dag, zodat uMAX()
. kunt gebruiken enMIN()
over de rijen in die groep. - De alias
C2
om overeen te komen met de laatste rij op een bepaalde dag. - De alias
C3
om overeen te komen met een rij later danC2
op dezelfde dag. Als er geen wordt gevonden, d.w.z.C3.*
is NULL, danC2
is de laatste op die dag.
Dit wordt vaak aangeduid als een greatest-n-per-group
query, en het komt vaak voor op Stack Overflow. Hier is een oplossing die ik heb getest voor uw testgegevens, maar u kunt de tag volgen die ik aan uw vraag heb toegevoegd voor andere oplossingen en discussies.
bewerken: Ik miste de vereiste voor zowel de openingsprijs als de slotprijs. Het volgende is bewerkt.
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;