mysql8窗口函数

mysql window函数

  • mysql 开窗函数demo&practice
    • 分组求和
    • 2. 和MySQL其它函数搭配

mysql 开窗函数demo&practice

注意: mysql8 才有开窗函数, mysql5.7以下不要阅读。

分组求和

create table sales (id int PRIMARY KEY auto_increment,city varchar(15),county varchar(15),sales_value DECIMAL
);insert into sales values 
(null, '北京市', '朝阳区', 30),
(null, '北京市', '海定区', 40),
(null, '上海市', '浦东新区', 30),
(null, '上海市', '徐汇区', 40)

需求:现在计算这个网站在每个城市的销售总额、在全国的销售总额、
每个区的销售额占所在城市销售额中的比率,以及占总销售额中的比率。

  1. 使用临时表 + 连接查询解决
-- 创建临时表
create TEMPORARY TABLE all_sales
select sum(sales_value) as sales_value from sales;select * from all_sales;-- 城市销售总额临时表
create TEMPORARY TABLE city_sales 
select city, sum(sales_value) as sales_value from sales 
group by city;select * from city_sales;SELECTa.*,b.sales_value AS 城市销售总额,c.sales_value AS 全国销售总额 
FROMsales aJOIN city_sales b ON a.city = b.cityJOIN all_sales c;
  1. 窗口函数+子查询解决
select 
(b.sales_value / b.city_val) as city_per,
(b.sales_value / b.all_val) as all_per,
b.* from 
(select sum(a.sales_value) over(partition by a.city) as city_val, sum(a.sales_value) over() as all_val, a.* from sales a
) as b;

partition by xxx, 按字段分区,可以理解分组,但是分组太鸡肋了。这个分组原来有多少行,现在就有多少行的。

使用语法小结:配合over使用

MySQL函数 over(开窗函数, 如分区,排序)# 如果没有函数
MySQL函数 over() as xxx

2. 和MySQL其它函数搭配

create table goods (id int primary key auto_increment,category_id int,category varchar(15),name varchar(50),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') ;
#1.1 ROW NUMBER() 函数
#ROW_NUMBER()函数能够对数据中的序号进行顺序显示。
#举例:查询goods数据表中每个商品分类下价格降序排列的各个商品信息。
select ROW_NUMBER() over(PARTITION by a.category_id order by a.price desc) as row_num, a.* from goods a;#1.2 RANK() 函数
#使用RANK()函数能够对序号进行并列排序,并且会跳过重复的序号,比如序号为1、1、3。
#举例:使用RANK()函数获取goods数据表中各类别的价格从高到低排序的各商品信息。
select RANK() over(partition by a.category_id order by a.price desc) as row_num, a.* from goods a;# DENSE_RANK()函数对序号进行并列排序,并且不会跳过重复的序号,比如序号为1、1、2。
# 举例:使用DENSE _RANK()函数获取goods数据表中各类别的价格从高到低排序的各商品信息。
select DENSE_RANK() over(PARTITION by a.category_id order by price desc) as row_num, a.* from goods a;#2.1 PERCENT RANK() 函数
#举例:计算goods数据表中名称为“女装/女士精品"的类别下的商品的PERCENT_RANK值。
# PERCENT_RANK() 是等级值百分比函数 
# 计算公式: (rank - 1) / (rows - 1), rank值为rank()函数产生的序号, rows为当前窗口的总记录数
select RANK() over(w) as v1, PERCENT_RANK() over(w) as v2, a.* from goods a where a.category_id = 1
window w as (partition by a.category_id order by a.price desc);-- ps: 使用 window w as (sql exp...) 类似的表示封装窗口函数, 然后用mysql特定的函数 + over(窗口函数) 调用。-- 2. CUME_DIST()函数
-- CUME_DIST()函数主要用于查询小于或等于某个值的比例。
-- 举例:查询goods数据表中小于或等于当前价格的比例。
select CUME_DIST() over(w) as v1, a.* from goods a
where 1=1 window w as (order by price);-- 3. 前后函数
-- 1. LAG(expr,n)函数
-- LAG(expr,n)函数返回当前行的前n行的expr的值。
-- 举例:查询Goods数据表中前一个商品价格与当前商品价格的差值.-- 查询前一个商品的价格... 
select LAG(a.price, 1) over(w) as last_price, a.* from goods a 
window w as (order by a.id);select (b.last_price - b.price) as diff_price, b.* from 
(select LAG(a.price, 1) over(w) as last_price, a.* from goods a window w as (order by a.id)
) as b;-- 2. LEAD(expr,n)函数
-- LEAD(expr,n)函数返回当前行的后n行的expr的值。
-- I举例:查询goods数据表中后一个商品价格与当前商品价格的差值。
select LEAD(a.price, 1) over(w) as behind_price, a.* from goods a 
window w as (order by a.price);-- 4.首尾函数
-- 1. FIRST_VALUE(expr)函数
-- FIRST_VALUE(expr)函数返回第一个expr的值。
-- 按照价格排序,查询第1个商品的价格信息。
select FIRST_VALUE(a.price) over(w) as v, a.* from goods a 
window w as (order by a.price);-- 5.其他函数
-- 1. NTH_VALUE(expr,n)函数
-- NTH_VALUE(expr,n)函数返回第n个expr的值。
-- 举例:查询goods数据表中排名第2和第3的价格信息。
select NTH_VALUE(a.price, 2) over(w) as second_val, NTH_VALUE(a.price,3) over(w) as third_val, a.* from goods a 
window w as (partition by a.category_id);-- 2. NTILE(n)函数
-- NTILE(n)函数将分区中的有序数据分为n个桶,记录桶编号。
-- 举例:将goods表中的商品按照价格分为3组。
select NTILE(3) over(w) as group_num, a.* from goods a 
window w as (partition by a.category_id order by a.price);

总结:能够分组,不会影响查询行数,可以在分组的基础上做数据操作。
上面的window写法,类似声明了变量 window 别名 as (xxxx), 查询的时候就可以引用了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/420284.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端学习(1341):mongoose验证规则延伸

const mongoose require(mongoose); mongoose.connect(mongodb://localhost/playground, { useUnifiedTopology: true }).then(() > console.log(数据库连接成功)).catch(err > console.log(err, 数据库连接失败))//创建集合规则 const postSchema new mongoose.Schema…

艾创机器人_世界教育机器人大赛 2019赛季世界锦标赛落幕曲靖代表队获多个奖项...

来源:曲靖日报-曲靖新闻网本报讯12月14日,世界教育机器人大赛(WER)2019赛季世界锦标赛在上海隆重开赛。来自中国、美国、英国、日本、菲律宾、墨西哥等30多个国家和地区的1万余名选手在大赛中一决高低。刚刚结束的第六届曲靖市青少年机器人竞赛余温未散,从比赛中脱颖…

javascript 学习笔记

一: js数据类型 js有两类数据类型,1:原始类型;2对象类型。 原始类型包括5中:数字,字符串,布尔,nil,undifined。 nil和undefined分属不同的类型,而此两种类型比…

MySQL8权限,角色

角色创建角色给角色赋予权限删除权限给用户赋予角色激活角色撤销用户权限创建角色 mysql> create role boss; Query OK, 0 rows affected (0.01 sec)mysql> create role manager; Query OK, 0 rows affected (0.01 sec)给角色赋予权限 manager角色拥有查询sales表的权限…

前端学习(1342):mongoose验证规则拿到错误信息

const mongoose require(mongoose); mongoose.connect(mongodb://localhost/playground, { useUnifiedTopology: true }).then(() > console.log(数据库连接成功)).catch(err > console.log(err, 数据库连接失败))//创建集合规则 const postSchema new mongoose.Schema…

单片机人流统计装置的程序_单片机其实不难

对于大学读电子方面专业的同学们,肯定知道有这么一个神奇的元器件,它枯燥难懂,但也十分吸引人,它就是我们今天要讲的元器件--单片机单片机作为工业控制领域里面最核心的部件,它存在于每一台机器,小到扫地机…

数据库索引的作用和长处缺点

为什么要创建索引呢?这是由于,创建索引能够大大提高系统的性能。 第一,通过创建唯一性索引,能够保证数据库表中每一行数据的唯一性。 第二,能够大大加快 数据的检索速度,这也是创建索引的最基本的原因。 第…

MySQL索引篇

index存储引擎索引InnoDB中的索引MyISAM索引存储引擎 以前一直认为关系型数据库中的索引不重要,知道最近学了MySQL高级篇,才发现,对MySQL一知半解。都是听人泛泛而谈。 首先MySQL服务器是怎么存数据的,怎么取到的,内…

sublime加入input函数_【挑战自学Python编程】第八天:while循环以及input()函数

摘要01 while循环02 input函数03 终端04 使用while循环与input()函数01 while循环在正式讲Python中的while前,希望大家先关注单词一下while,翻译为中文意思是:当。(这里我们只需要这一种意思即可)下面我们开始看while循…

文件循环读取_一个案例轻松认识Python文件处理提取文件中的数字

1、文件打开使用 open() 函数打开文件。它需要两个参数,第一个参数是文件路径或文件名,第二个是文件的打开模式。模式通常是下面这样的:"r",以只读模式打开,你只能读取文件但不能编辑/删除文件的任何内容&qu…

B/S架构

程序架构 tomcat目录结构: bin:存放启动和关闭tomcat的脚本文件; conf:存放配置文件 lib:存放所需的jar文件 webapps:存放发布的web程序 work:存入tomcat工作时产生的文件 1.tomcat配置端口,当默认的8080端口被占用时修改8080端口的位置在tom…

前端学习(1344):用户的增删改查操作1

const http require(http); const mongoose require(mongoose);//数据库连接 mongoose.connect(mongodb://localhost/playground, { useUnifiedTopology: true }).then(() > console.log(数据库连接成功)).catch(() > console.log(数据库连接失败));const userSchema …

索引常用注意事项

索引1. 索引怎么建好?2. 索引容易失效的场景3. 连接查询索引优化4. order by,group by5. 覆盖索引6. 索引下推1. 索引怎么建好? 单表 主键必须唯一,且单调递增有唯一键的,尽量建立唯一键where条件用得比较多的字段查询…

EntityFramework的安装

关于EntityFramework在vs2012无法引用的问题 这段时间学习MVC,发现一个问题,我公司的电脑可以直接引用EntityFrameWork这个命名空间,但我家里面的电脑就不能直接引用,刚开始以为是我电脑配置问题,后重装电脑&#xff0…

毫米波雷达_最新的7个毫米波雷达应用案例

毫米波雷达传感器如何做到"全天候"?毫米波雷达使用的技术是毫米波(millimeterwave),通常缩写为MMW,波长为1~10毫米,频率为30~300GHz的电磁波。根据波的传播理论,频率越高,波长越短&am…

前端学习(1345):用户的增删改查操作2

//创建http连接 const http require(http); //创建服务器 const app http.createServer(); //第三方模块导入 const mongoose require(mongoose); //获取连接 const url require(url); //数据库连接地址 mongoose.connect(mongodb://localhost/playground, { useUnifiedTop…

太阳光是平行光吗_“彩虹的形成是因为光的色散和光沿直线传播是一回事吗?”...

-1感谢某不愿透露姓名的高中同学提供支持。0请先解释一下你的这个问题提法可能的歧义:究竟是“是因为”后面的词语组成一个整体,还是“和”前面的词语组成一个整体呢?不讲清楚的话,答案会有一些差距。1“彩虹的形成是因为光的色散…

力扣刷题【20,21,26,27,35】

-20 有效的括号21 合并两个有序链表26 删除数组中的重复项27. 移除元素35. 搜索插入位置20 有效的括号 使用replace一直替换 package top.lel.lc.easy.valid_parentheses;import java.util.Deque; import java.util.HashMap; import java.util.LinkedList; import java.util.…

前端学习(1346):用户的增删改查操作3增加

//创建http连接 const http require(http); //创建服务器 const app http.createServer(); //第三方模块导入 const mongoose require(mongoose); //获取连接 const url require(url); // const querystring require(querystring); //数据库连接地址 mongoose.connect(mon…