MySQL数据库聚合,如何通过group by过滤次相同组数量最多的列

如何通过group by过滤次相同组数量最多的列

背景

之前潘同学问了我一个问题,group by如何刷选出同组个数次数最多的一行,我试了一下,没有找到解决方案,于是就回了他可能需要用函数来解决,但是后来又仔细想了一下,肯定有其他更好的方法,于是接着琢磨了一下。

过程

group-by.png

描述: 按照c1,c2,c3分组,得到结果集
但是要得到c4,结果最多那个。

建表添加测试集

0-d7da2c3fedf10d377efa5254ed6a791e

解决方案

1-975021a756c9413f452188b4fa900499

解决问题思路

  1. 需要做两次group by,第一次group by统计出前三项相同的组出现的次数,然后对数量做倒序排列,group by的特点,相同组的数据只取第一条,所以为了拿到数量最多的,我们需要对数量做倒序排列。

  2. 第二次group by才是真正的拿到数据,相同组的第一条数据

pgSQl的解决方案

当时想到pgsql其实更好处理这个问题,不用想这个麻烦,异曲同工之妙。WITH .... AS,pgsql显得更加的强大些。 2-b5be727b1df6279bf858afaee0604cd8

知识扩展

  1. mysql中count为什么需要参数,count(1)和count(),count(a)有什么区别,其实count(1)和count()每什么区别,有区别的是count(a),它会过滤掉a = NULL的记录, 所有count(a) <= count(1) or count(*)

总结

  1. MySQl和pgSQL功能是在太强大了,关系查询的特性,帮助我们减少了代码量,提升了工作效率。
  2. 自己对数据库的知识尚且薄弱,仍有很多知识需要学习的。
  3. 如果表的行数特别大的话,可能两次group by操作比较耗时,所有我们可以分步骤进行,或者建立视图。 http://image.sourcedev.cc/tmp/download/search.png

0 comments

To reply to the article, please Login or registered