Więc chcesz:
- Alias
C
odpowiadać wszystkim wierszom w grupie na dany dzień, więc możesz użyćMAX()
iMIN()
nad wierszami w tej grupie. - Alias
C2
odpowiadać ostatniemu wierszowi w danym dniu. - Alias
C3
odpowiadać wierszowi późniejszemu niżC2
tego samego dnia. Jeśli nie zostanie znaleziony, np.C3.*
ma wartość NULL, toC2
jest najnowszym tego dnia.
Jest to często określane jako greatest-n-per-group
zapytanie i często pojawia się na Stack Overflow. Oto rozwiązanie, które przetestowałem dla twoich danych testowych, ale możesz śledzić tag, który dodałem do twojego pytania, aby uzyskać inne rozwiązania i dyskusję.
edytuj: Brakowało mi wymagania zarówno ceny otwarcia, jak i ceny zamknięcia. Poniższe są edytowane.
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;