下面大家来看一下如何使用子查询和LIMIT子句来截取GROUP BY分组的数据:
SELECT name, AVG(score) avg_score FROM scores GROUP BY name HAVING avg_score >( SELECT AVG(score) FROM scores GROUP BY name LIMIT 1 )
在上面的例子中,大家首先使用GROUP BY语句将scores表按照name列进行分组,并计算每个分组的平均值。然后,大家使用HAVING子句来筛选出平均分高于整个表的平均分的分组。
有时候大家需要根据指定规则截取分组后的数据,例如,只显示每个分组中前三高的分数。这时候可以使用变量和CASE语句来实现:
SELECT name, score FROM ( SELECT name, score, @row_num := IF(@prev_name = name, @row_num+1, 1) AS row_number, @prev_name := name FROM scores, (SELECT @row_num := 0, @prev_name := '') t ORDER BY name, score DESC ) t WHERE row_number<= 3
在上面的例子中,大家首先使用子查询和变量来给每条数据添加了一个行号,然后使用WHERE子句找出每个分组前三高的分数。
总之,MySQL中的分组函数和语句非常强大,可以方便地对数据进行条件分析和聚合运算。而在实际应用中,也需要灵活地组合使用各种语句和函数,以达到预期的效果。