在 MySQL 中从分组聚合查询中获取第一条和最后一条记录
在数据库操作中,经常不仅需要检索聚合值,还需要检索聚合值有关分组集中第一个和最后一个记录的特定信息。考虑这样一个场景:我们正在获取按特定时间段(例如周或年)分组的一组值的聚合数据,并且我们希望检索每个组的开盘值和收盘值。
要实现为此,我们最初可能会考虑使用子查询为每个组发出多个单独的查询。然而,这种方法并不是最理想的,尤其是对于大型数据集。 MySQL 使用聚合函数结合附加过滤和数据操作函数为此类场景提供了有效的解决方案。
要获取每个组的第一条和最后一条记录,我们可以利用 GROUP_CONCAT 和 SUBSTRING_INDEX 函数。 GROUP_CONCAT 允许我们连接每个组中指定列的值,SUBSTRING_INDEX 允许我们根据分隔符提取第一个或最后一个子字符串。
例如,要检索每年每周的开始和结束值,我们将查询修改如下:
SELECT MIN(low_price), MAX(high_price), SUBSTRING_INDEX(GROUP_CONCAT(CAST(open AS CHAR) ORDER BY datetime), ',', 1) AS open, SUBSTRING_INDEX(GROUP_CONCAT(CAST(close AS CHAR) ORDER BY datetime DESC), ',', 1) AS close FROM symbols WHERE date BETWEEN(.. ..) GROUP BY YEARWEEK(date)
此查询按每年的周对数据进行分组,并计算最小 low_price 和最大 high_price。此外,它使用 GROUP_CONCAT 连接每个组的所有开放值,按日期时间升序排序,并使用 SUBSTRING_INDEX 提取第一条记录作为开放值。同样,它按降序连接所有收盘值,并提取最后一条记录作为每个组的收盘值。
通过利用这些函数,我们避免了子查询和昂贵的处理的需要,从而更快、更高效查询,尤其是在处理大型数据集时。
以上是如何从 MySQL 中的分组聚合查询中获取第一条和最后一条记录?的详细内容。更多信息请关注PHP中文网其他相关文章!