Suponiendo que desea que los identificadores de los registros con el LOW_PRICE más bajo y el más alto HIGH_PRICE se podría añadir estas dos columnas a la consulta,
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)
Si la eficiencia es un problema, debe agregar una columna para 'year_week', agregar algunos índices de cobertura y dividir la consulta en dos.
La columna 'year_week' es simplemente un INT configurado con el valor de YEARWEEK (date) y se actualiza cada vez que se actualiza la columna 'date'. De esta forma, no tiene que volver a calcularlo para cada consulta y puede indexarlo.
Los nuevos índices de cubierta deberían verse así. El orden es importante. yw_lp_id CLAVE (year_week, LOW_PRICE, id), CLAVE yw_hp_id (year_week, HIGH_PRICE, id)
A continuación, debe utilizar estos dos consultas
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
y
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
Cubriendo los índices están bastante útil. Consulte this para obtener más detalles.
Para mayor eficiencia, ver http://mysql.rjweb.org/doc.php/groupwise_max –