mysql8.0的新特性-窗口函数


窗口函数

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;

相比之下,窗口函数的执行效率更高,且简洁易懂


文章作者: liming
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 liming !
评论
  目录