在数据分析工作中,我们通常会遇到这样的问题,一个业务部门由若干业务组构成,需要筛选出每个业务组里业绩前N名的业务员。这其实是一个分组排序的问题,那么如何通过SQL语言来实现呢?
已知我们有一张业务表business,由业务组-group_name,业务员-employee_name和业务量-business_count 3个字段构成,数据内容如下:
oracle中可直接通过row_number()函数直接实现按照指定字段进行排序的功能,语法如下:
ROW_NUMBER() OVER(PARTITION BY COLUMN_1 ORDER BY COLUMN_2)
其中,COLUMN_1为分组字段,在该问题中即为业务组;COLUMN_2为排序字段,在该问题中即为业务量,默认为升序排列,如需降序排列则在其后加DESC。下图即为在Oracle中通过row_number()函数实现的按业务组分组将业务量降序排列,并得到排名的结果。
然而,在MySQL中并没有这样一个函数能够实现分组排序的功能,但工作还是要做,所以我们可通过如下方法来实现在MySQL中分组排序的功能:
首先,我们定义了2个子查询t1和t2,在t1中我们将需要保留的字段从原表中提取出来,并按照分组字段group_name和排序字段business_count进行排序;在t2中我们定义了排序编号rank和当前分组g这两个变量。然后,在查询语句中使用if判断来实现对每一条记录输出编号rank和所属分组group。
如此,我们可以通过在该语句外加一层查询来实现提取前几名业务员的数据需求,例如提取出每个业务组前5名业务员的情况:
以上我们就实现了在MySQL中进行分组排序的功能,祝大家提数愉快!
#------------------历史旧文,轻拍轻拍-----------------#