Supponendo che si desidera gli ID dei record con il LOW_PRICE più basso e il più alto HIGH_PRICE si potrebbe aggiungere queste due colonne per la tua ricerca,
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)
Se l'efficienza è un problema, è necessario aggiungere una colonna per "year_week", aggiungere alcuni indici di copertura e dividere la query in due.
La colonna 'year_week' è solo un INT impostato sul valore di YEARWEEK (data) e aggiornato ogni volta che la colonna 'data' viene aggiornata. In questo modo non devi ricalcolarlo per ogni query e puoi indicizzarlo.
I nuovi indici di copertura dovrebbero apparire così. L'ordine è importante. KEY yw_lp_id (year_week, LOW_PRICE, id), KEY yw_hp_id (year_week, HIGH_PRICE, id)
Si dovrebbe quindi utilizzare queste due query
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
e
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
copre indici sono abbastanza utile. Controlla this per ulteriori dettagli.
Per una maggiore efficienza, vedere http://mysql.rjweb.org/doc.php/groupwise_max –