Takže chcete:
- Alias
C
aby odpovídaly všem řádkům ve skupině pro daný den, takže můžete použítMAX()
aMIN()
nad řádky v této skupině. - Alias
C2
aby odpovídaly poslednímu řádku v daný den. - Alias
C3
aby odpovídala řádku pozdějšímu nežC2
ten samý den. Pokud není nalezen žádný, tj.C3.*
je NULL, pakC2
je nejpozději v daný den.
Toto je často označováno jako greatest-n-per-group
dotazu a často se objevuje na Stack Overflow. Zde je řešení, které jsem testoval pro vaše testovací data, ale můžete sledovat značku, kterou jsem přidal k vaší otázce, kde najdete další řešení a diskusi.
upravit: Chyběl mi požadavek na otevírací i zavírací cenu. Následující text je upraven.
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;