SQL中的开窗函数

开窗函数具体介绍:
https://zhuanlan.zhihu.com/p/92654574 (已读)
https://www.cnblogs.com/lihaoyang/p/6756956.html

distribute/partition/sort by:

https://blog.csdn.net/qq_16320025/article/details/102976995

窗口函数的基本语法如下:

<窗口函数> over (partition by <用于分组的列名>
                order by <用于排序的列名>
                rows between m preceding and n following <开窗(!用于聚合函数!)范围从m行之前到n行后>)

over是新建了列,partition是根据属性分区(所以可以不要)order是对新的序列排序(所以也可以不要)

简单来说,窗口函数有以下功能:
1)同时具有分组和排序的功能
2)不减少原表的行数

<窗口函数>的位置,可以放以下两种函数:
1) 专用窗口函数,包括后面要讲到的rank, dense_rank, row_number等专用窗口函数。
三个函数区别如下图:
在这里插入图片描述
注意:用开窗函数新建的列不能用having筛选

2) 聚合函数,如sum. avg, count, max, min等
不仅是sum求和,平均、计数、最大最小值,也是同理,都是针对自身记录、以及自身记录之上的所有数据进行计算,现在再结合刚才得到的结果
在这里插入图片描述

最近刷牛客网的题刷到了开窗函数的应用,系统学习一下:

题目:现在运营想要找到每个学校gpa最低的同学来做调研,请你取出每个学校的最低gpa。
示例:user_profile
在这里插入图片描述

根据示例,你的查询结果应参考以下格式:
在这里插入图片描述

这道题有个思路:一是用开窗函数标号后取最小的号,二是用自查询找到最小的gpa然后连结表格找到最小gpa同学的id
第一种方法:

select
    a.device_id,
    a.university,
    a.gpa
from(
select 
    device_id,
    university,
    gpa,
    ROW_NUMBER() over (PARTITION BY university ORDER BY gpa)  as gpaorder
FROM user_profile
    ) a
where a.gpaorder = 1

开窗函数的另一种方法(不标号,匹配最小gpa)

SELECT
    device_id,
    university,
    gpa
FROM(
	SELECT 
	    device_id,
	    university,
	    gpa,
	    min(gpa) over (PARTITION BY university ) as newgpa
	FROM user_profile 
) a
WHERE gpa = newgpa

第二种方法:

select 
    a.device_id,
    b.university,
    b.gpa
from user_profile a
    inner join
    (SELECT 
        university,
        min(gpa) as gpa
    FROM user_profile
    GROUP BY university
    ) b
    ON a.gpa = b.gpa and a.university = b.university
ORDER BY b.university```


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值