假设您想要具有最低 low_price 和最高 high_price 的记录的 ID,您可以将这两列添加到您的查询中,
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”添加一列,添加一些覆盖索引,并将查询一分为二。
“year_week”列只是一个设置为 YEARWEEK(date) 值的 INT,并在“date”列更新时更新。这样您就不必为每个查询重新计算它,您可以对其进行索引。
新的覆盖索引应如下所示。顺序很重要。
KEY yw_lp_id (year_week, low_price, id),
KEY yw_hp_id (year_week, high_price, id)
然后你应该使用这两个查询
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
覆盖索引非常有用。查看this了解更多详情。