窗口函数
1.1简介
窗口函数可以分为
静态、动态
静态窗口函数的窗口大小是固定的, 不会因为记录的不同而不同;
动态窗口函数的窗口大小会随着记录的不同而变化;优点:减少了重复繁琐的子查
1.2语法结构
OVER 关键字指定窗口的范围,通常配合嵌套查询使用;
函数 OVER ([PARTITION BY 字段名 ORDER BY 字段名 ASC|DESC]
窗口函数 MySQL 8开始支持窗口函数。在之前的版本中已存在的大部分 聚合函数 在MySQL 8中也可以
作为窗口函数来使用。学过大数据的应该都知道这玩意跟hive中的窗口函数类似,简单来说窗口函数就是不进行
内部的聚合,而是将所聚合的字段的结果全部保留。刚开始理解可能有点困难,我们就根据案例来进行理解。
2.案例需求:查询每种商品分类下,价格前3大的信息
数据准备
CREATE TABLE goods( id INT PRIMARY KEY AUTO_INCREMENT, category_id INT, category VARCHAR(15), NAME VARCHAR(30), price DECIMAL(10,2), stock INT, upper_time DATETIME );
INSERT INTO goods(category_id,category,NAME,price,stock,upper_time) VALUES (1, '女装/女士精品', 'T恤', 39.90, 1000, '2020-11-10 00:00:00'), (1, '女装/女士精品', '连衣裙', 79.90, 2500, '2020-11-10 00:00:00'), (1, '女装/女士精品', '卫衣', 89.90, 1500, '2020-11-10 00:00:00'), (1, '女装/女士精品', '牛仔裤', 89.90, 3500, '2020-11-10 00:00:00'), (1, '女装/女士精品', '百褶裙', 29.90, 500, '2020-11-10 00:00:00'), (1, '女装/女士精品', '呢绒外套', 399.90, 1200, '2020-11-10 00:00:00'), (2, '户外运动', '自行车', 399.90, 1000, '2020-11-10 00:00:00'), (2, '户外运动', '山地自行车', 1399.90, 2500, '2020-11-10 00:00:00'), (2, '户外运动', '登山杖', 59.90, 1500, '2020-11-10 00:00:00'), (2, '户外运动', '骑行装备', 399.90, 3500, '2020-11-10 00:00:00'), (2, '户外运动', '运动外套', 799.90, 500, '2020-11-10 00:00:00'), (2, '户外运动', '滑板', 499.90, 1200, '2020-11-10 00:00:00');
需求分析:需要根据表中category分类或者根据id分类,取每个分类中的价格前3的价格信息。考虑使用子查询或者窗口函数
普通的嵌套查询:
select * from (select id,category,name,price,stock from goods where category_id =1 order by price desc limit 3) as t
union all select *from (select id,category,name,price,stock from goods where category_id =2 order by price desc limit 3) as t1;
窗口函数查询:
select * from (select row_number() over (PARTITION BY category_id order by price desc ) as row_id, id,category_id,NAME,price,stock from goods ) k where row_id<=3;
相比之下,窗口函数的执行效率更高,且简洁易懂