mysql窗口函数

简介

最近项目上遇到一个排行榜的统计。本市所有企业中,排名前十的企业类型,并且这些类型主要分布再哪个区域。很显然,如果是oracle,我们就可以直接使用窗口函数了。但是mysql没有窗口函数,这就需要我们自己实现了。

建表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE TABLE `tem` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`str` char(1) DEFAULT NULL,
PRIMARY KEY (`id`)
) ;

-- 造数据
INSERT INTO `test`.`tem`(`id`, `str`) VALUES (1, 'A');
INSERT INTO `test`.`tem`(`id`, `str`) VALUES (2, 'B');
INSERT INTO `test`.`tem`(`id`, `str`) VALUES (3, 'A');
INSERT INTO `test`.`tem`(`id`, `str`) VALUES (4, 'C');
INSERT INTO `test`.`tem`(`id`, `str`) VALUES (5, 'A');
INSERT INTO `test`.`tem`(`id`, `str`) VALUES (6, 'C');
INSERT INTO `test`.`tem`(`id`, `str`) VALUES (7, 'B');
单一排行榜 row_number() over(order by )
1
2
3
4
5
6
7
8
SELECT
@num := @num+1 num,
id,
str
FROM
tem, (SELECT @str := '', @num := 0) t1
ORDER BY
str, id;

排行榜

实现分组排名效果(row_number() over(partition by order by ))
1
2
3
4
5
6
7
8
SELECT
@num := IF(@str = str, @num + 1, 1) num,
id,
@str := str str
FROM
tem, (SELECT @str := '', @num := 0) t1
ORDER BY
str, id;

排行榜

总结

mysql8已经自带窗口函数了。对于多类型的排名分组就更简单方便。