本篇文章将深入探讨MySQL中的分区函数PARTITION BY
的使用方法。让我们直接进入正题。
注意: 请确保您的MySQL版本支持窗口函数(MySQL 8.0及以上版本支持)。如果您的MySQL版本低于8.0,则无法使用窗口函数。
一、建表语句
-- 创建商品表
CREATE TABLE `commodity` (
`id` int NOT NULL COMMENT '主键',
`position` varchar(50) DEFAULT NULL COMMENT '位置(商品放置的货架)',
`type` varchar(50) DEFAULT NULL COMMENT '类型',
`price` decimal(10,2) DEFAULT NULL COMMENT '价格',
PRIMARY KEY (`id`)
) COMMENT='商品表';
-- 初始化数据
INSERT INTO commodity VALUES (1, '1-001', '苹果', 8.00);
INSERT INTO commodity VALUES (2, '2-002', '苹果', 10.00);
INSERT INTO commodity VALUES (3, '3-003', '苹果', 12.00);
INSERT INTO commodity VALUES (6, '1-001', '橘子', 5.00);
INSERT INTO commodity VALUES (7, '1-001', '橙子', 6.00);
INSERT INTO commodity VALUES (8, '3-003', '橙子', 8.00);
INSERT INTO commodity VALUES (10, '2-002', '菠萝', 10.00);
INSERT INTO commodity VALUES (9, '2-002', '香蕉', 5.00);
INSERT INTO commodity VALUES (4, '1-001', '苹果', 12.00);
INSERT INTO commodity VALUES (5, '1-001', '香蕉', 5.00);
二、窗口函数
1、PARTITION BY
窗口函数与GROUP BY
分组的区别
PARTITION BY
关键字是分析函数的一部分,与聚合函数(如GROUP BY
)的主要区别在于,PARTITION BY
可以返回一个分组中的多条记录,而聚合函数通常只返回一条反映统计值的记录。
PARTITION BY
用于对结果集进行分组,如果未指定,则整个结果集被视为一个分组。
与GROUP BY
不同,PARTITION BY
返回的是分组中的每条数据,并且可以对分组数据进行排序操作。GROUP BY
只能返回聚合后的组的数据统计值的记录。
PARTITION BY
与GROUP BY
的主要区别在于,前者在保留全部数据的基础上,只对其中某些字段进行分组排序(类似于Excel中的操作),而GROUP BY
则只保留参与分组的字段和聚合函数的结果;简而言之,窗口函数对部分数据进行排序、计算等操作,GROUP BY
对一组值进行聚合,即窗口函数是每一行都会保留,GROUP BY
是从多行浓缩为少数行。
2、窗口函数基本语法
<窗口函数> over (PARTITION BY<用于分组的列名> ORDER BY <用于排序的列名>)
3、窗口函数
专用窗口函数:RANK(), DENSE_RANK(), ROW_NUMBER()
聚合函数:SUM(), MAX(), MIN(), COUNT(), AVG() 等
三、窗口函数的使用
1、OVER函数的写法
-- 先对type中相同的进行分区,在type中相同的情况下对price进行排序
OVER(PARTITION BY type ORDER BY price DESC)
2、专用窗口函数RANK()、ROW_NUMBER()以及DENSE_RANK()
SELECT *, RANK() OVER(PARTITION BY type ORDER BY price DESC) AS mm FROM commodity;
SELECT *, ROW_NUMBER() OVER(PARTITION BY type ORDER BY price DESC) AS mm FROM commodity;
SELECT *, DENSE_RANK() OVER(PARTITION BY type ORDER BY price DESC) AS mm FROM commodity;
从以上结果来看:
RANK()函数: 如果存在并列名次的行,会占用下一个名次的位置,例如苹果组内排名【1,2,3,4】,但由于有两个并列的,所以显示的排名是【1,1,3,4】,其中2的位置被占用了。
ROW_NUMBER()函数: 不考虑并列的情况,即使遇到price相同的情况,也会默认排出一个先后顺序。
DENSE_RANK()函数: 如果存在并列名次的行,不会占用下一个名次的位置,例如图片的最后显示的是【1
相关文章
暂无评论...