Така че искате:
- Псевдонимът
C
за да съответства на всички редове в групата за даден ден, така че можете да използватеMAX()
иMIN()
върху редовете в тази група. - Псевдонимът
C2
да съответства на последния ред в даден ден. - Псевдонимът
C3
да съответства на ред по-късен отC2
На същия ден. Ако не бъде намерено, т.е.C3.*
е NULL, след товаC2
е последният за този ден.
Това често се означава като greatest-n-per-group
заявка и се появява често в Stack Overflow. Ето решение, което тествах за вашите тестови данни, но можете да следвате маркера, който добавих към въпроса ви за други решения и дискусии.
редактиране: Пропуснах изискването както за начална цена, така и за цена на затваряне. Следното е редактирано.
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;