mysql sum函数_开窗函数在MySql中的使用

44e3c28598692e7e8ab4febde3197cce.png

MySql在8.0的版本增加了对开窗函数的支持,终于可以在MySql使用开窗函数了。开窗函数又称OLAP函数(Online Analytical Processing).

  1. 开窗函数的语法结构:
#Key word :Partiton by & order by

开窗函数大体分为两种:

a. 能够作为开窗函数的聚合函数:(sum,avg,count,max,min)

b. 专用开窗函数:(Rank,Dense_Rank,Row_Number)

2. 实操练习

1)建立数据表,插入数据

#a. 在本地DataBase新建一个Table,用于存储练习数据
Create Table Product
(product_id CHAR(4) not full,
product_name VARCHAR(100) not full ,
product_type VARCHAR(32) not full ,
sale_price INTEGER ,
purchase_price INTEGER ,
regist_date Date,
primary KEY (product_id));
# b.插入练习数据
# 插入数据
insert into Product values ('0001','T恤衫','衣服',1000,500,'2009-09-20');
insert into Product values ('0002','打孔器','办公用品',500,320,'2009-09-11');
insert into Product values ('0003','运动T恤衫','衣服',400,280,null);
insert into Product values ('0004','菜刀','厨房用具',3000,2800,'2009-01-20');
insert into Product values ('0005','高压锅','厨房用具',6800,5000,'2009-01-15');
insert into Product values ('0006','叉子','厨房用具',500,null,'2009-09-20');
insert into Product values ('0007','擦菜板','厨房用具',880,790,'2008-04-08');
insert into Product values ('0008','圆珠笔','办公用品',100,null,'2009-11-11');

2)专用窗口函数使用

a) 使用方法

Rank 函数是记录排序顺序的函数,不同于Group by 函数,开窗函数的使用不会减少数据表的函数,类别也不会只有一种。

# 将表中8种商品,根据product_type,按照sale_price进行排序
select product_id,product_name,product_type,sale_price,
rank() over (PARTITION by product_type 
order by sale_price asc ) as '排序'
from product

c655d5f62dd720a5f8f32f2b16498cad.png
展示结果

语句中,PARTITION By 指定排序的对象范围(横向上对表进行分组),order by 指定了按照哪一列,何种顺序进行排列(纵向定义排序规则)。

如果不使用PARTITION By,效果如何?

# 将PARTITION  By 函数组置为沉默项
select product_id,product_name,product_type,sale_price,
rank() over 
-- PARTITION by product_type 
(order by sale_price asc)  as '排序'
from product

43d758e8fcac0a66607c0146ae7d2a39.png

结果如下:1)数据展示直接按照sale_price 排序 2)价格并列时,排序结果一致,并将排序计数值+1 ;

b)函数区别

上面提到专用开窗函数有三种:Rank,Dense_Rank,Row_Number,这三种有什么区别呢?

#下面将3种函数排序结果分被定义为 排序1,排序2,排序3,进行结果输出:
select product_id,product_name,product_type,sale_price,
rank() over  (order by sale_price asc)  as '排序1',
dense_rank() over  (order by sale_price asc)  as '排序2',
row_number() over  (order by sale_price asc)  as '排序3'
from product

49e072403007062f00fc9ee51b145f75.png

将排序1和排序2 相比,可以看出,dense_rank 函数在计算并列结果时,并列值不占位,出现连续两个3号位时,后面计数结果仍为4;将排序2和排序3相比,可以看出,row-number 无论sale_price 值是否一致,都会计算一个唯一值,并不会计算连续值。

c) 聚合函数作开窗函数

可以将(sum,avg,count,max,min)等聚合函数引用至开窗函数中:

#sum 聚合函数的使用
select product_id,product_name,product_type,sale_price,
sum(sale_price) over  (order by product_id)  as '排序1'
from product

2c7bffda0fe535a39a52ebaf44ea6e42.png

可以看出以上结果时将sale_price 进行累加,在排序1中计算出上面结果的累计和,表中数据按照order by product_id 进行顺序排列;同理AVG 函数则是将计算累加值的平均值。

d) 保证排序结果的顺序

根据上面结果进行排序时,有时排序结果时无序的,可以使用双order by 进行顺序排列:

# 对计算结果再次进行排列
select product_id,product_name,product_type,sale_price,
rank() over  (order by sale_price )  as '排序1'
from product
order by 排序1

186388134df4e61ed07c303724500111.png

好了,可以愉快的去牛客网手撕代码了~~

93fc675e7994ce7a23cc4e6953aa2937.png

上图是牛客网真题,要求按照salary 进行排序并计算排序结果:

SELECT emp_no, salaries, DENSE_RANK() OVER(ORDER BY salary DESC) AS rank
WHERE to_date = '9999-01-01' ORDER BY salary DESC, emp_no ASC
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL开窗函数是一种强大的功能,可以根据指定的条件对查询结果进行分组、排序和聚合操作。开窗函数可以用于计算每个分组内的聚合值,并且可以在查询结果返回每个行的详细信息。这使得开窗函数在处理复杂的分析和报表查询时非常有用。 在MySQL开窗函数的语法遵循标准的SQL语法。您可以在MySQL 8.0的官方文档找到有关开窗函数的详细信息和示例用法。 开窗函数可以根据其功能进行分类。常见的开窗函数包括聚合开窗函数、排序开窗函数和其他类型的开窗函数。聚合开窗函数用于计算聚合值,比如求和、平均值等。排序开窗函数用于根据指定的条件对结果集进行排序。其他类型的开窗函数可以根据具体需求进行自定义的操作。 一个常见的示例是使用SUM函数作为聚合开窗函数,对每个分组内的特定列进行求和。例如,在一个名为"linux"的表,我们可以使用SUM函数计算每个name分组内的cnt列的总和,并使用开窗函数在查询结果返回每一行的详细信息。 我希望这个回答能帮助到您理解MySQL开窗函数。如果您需要更多信息,请参考MySQL 8.0的官方文档。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [MySQL开窗函数](https://blog.csdn.net/mr__sun__/article/details/124257213)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [mysql开窗函数](https://blog.csdn.net/m0_46926492/article/details/124236167)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值