MySQL数据库聚合,如何通过group by过滤次相同组数量最多的列
如何通过group by过滤次相同组数量最多的列
背景
之前潘同学问了我一个问题,group by如何刷选出同组个数次数最多的一行,我试了一下,没有找到解决方案,于是就回了他可能需要用函数来解决,但是后来又仔细想了一下,肯定有其他更好的方法,于是接着琢磨了一下。
过程
描述:
按照c1,c2,c3分组,得到结果集
但是要得到c4,结果最多那个。
建表添加测试集
解决方案
解决问题思路
-
需要做两次group by,第一次group by统计出前三项相同的组出现的次数,然后对数量做倒序排列,group by的特点,相同组的数据只取第一条,所以为了拿到数量最多的,我们需要对数量做倒序排列。
- 第二次group by才是真正的拿到数据,相同组的第一条数据
pgSQl的解决方案
当时想到pgsql其实更好处理这个问题,不用想这个麻烦,异曲同工之妙。WITH .... AS,pgsql显得更加的强大些。
知识扩展
- mysql中count为什么需要参数,count(1)和count(),count(a)有什么区别,其实count(1)和count()每什么区别,有区别的是count(a),它会过滤掉a = NULL的记录, 所有count(a) <= count(1) or count(*)
总结
- MySQl和pgSQL功能是在太强大了,关系查询的特性,帮助我们减少了代码量,提升了工作效率。
- 自己对数据库的知识尚且薄弱,仍有很多知识需要学习的。
- 如果表的行数特别大的话,可能两次group by操作比较耗时,所有我们可以分步骤进行,或者建立视图。

0 comments
To reply to the article, please Login or registered