最小のlow_priceと最大のhigh_priceを持つレコードのIDが必要であると仮定すると、これら2つの列をクエリに追加できます。
SELECT
(SELECT id ORDER BY low_price ASC LIMIT 1) low_price_id,
(SELECT id ORDER BY high_price DESC LIMIT 1) high_price_id,
MIN(low_price), MAX(high_price), open, close
FROM symbols
WHERE date BETWEEN(.. ..)
GROUP BY YEARWEEK(date)
効率が問題になる場合は、「year_week」の列を追加し、カバーするインデックスをいくつか追加して、クエリを2つに分割する必要があります。
'year_week'列は、YEARWEEK(date)の値に設定されたINTであり、'date'列が更新されるたびに更新されます。このようにして、クエリごとに再計算する必要がなく、インデックスを作成できます。
新しいカバーインデックスは次のようになります。順序は重要です。KEY yw_lp_id(year_week、low_price、id)、KEY yw_hp_id(year_week、high_price、id)
次に、これら2つのクエリを使用する必要があります
SELECT
(SELECT id ORDER BY low_price ASC LIMIT 1) low_price_id,
MIN(low_price), open, close
FROM symbols
WHERE year_week BETWEEN(.. ..)
GROUP BY year_week
と
SELECT
(SELECT id ORDER BY high_price DESC LIMIT 1) high_price_id,
MAX(high_price), open, close
FROM symbols
WHERE year_week BETWEEN(.. ..)
GROUP BY year_week
カバーインデックスは非常に便利です。詳細については、こちらをご覧ください。