だからあなたが欲しい:
- エイリアス
C
特定の日のグループ内のすべての行に対応するため、MAX()
を使用できます およびMIN()
そのグループの行の上に。 - エイリアス
C2
特定の日の最後の行に対応します。 - エイリアス
C3
C2
より後の行に対応する 同じ日に。何も見つからない場合、つまりC3.*
NULLの場合、C2
その日の最新です。
これは多くの場合、greatest-n-per-group
というラベルが付けられています クエリを実行すると、StackOverflowで頻繁に発生します。これが私があなたのテストデータのためにテストした解決策ですが、他の解決策と議論のためにあなたの質問に追加したタグに従うことができます。
編集: 始値と終値の両方の要件を逃しました。以下を編集します。
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;