Så du vil have:
- Aliaset
C
for at svare til alle rækker i gruppen for en given dag, så du kan brugeMAX()
ogMIN()
over rækkerne i den gruppe. - Aliaset
C2
for at svare til den sidste række på en given dag. - Aliaset
C3
at svare til en række senere endC2
samme dag. Hvis ingen findes, dvs.C3.*
er NULL, derefterC2
er den seneste på den dag.
Dette er ofte mærket som en greatest-n-per-group
forespørgsel, og den kommer ofte op på Stack Overflow. Her er en løsning, som jeg testede for dine testdata, men du kan følge tagget, jeg tilføjede til dit spørgsmål, for andre løsninger og diskussion.
rediger: Jeg savnede kravet til både åbningskurs og lukkekurs. Følgende er redigeret.
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;