SQL-窗口函数

什么是窗口函数

可以像聚合函数一样对一组数据进行分析并返回结果,二者的不同之处在于,窗口函数不是将一组数据汇总成单个结果,而是为每一行数据都返回一个结果。

窗口函数组成部分

1.创建数据分区

窗口函数OVER子句中的PARTITION BY选项用于定义分区,其作用类似于查询语句中的GROUP BY子句。如果我们指定了分区选项,窗口函数将会分别针对每个分区单独进行分析。

1.另外开一列,求出每个部门的平均年龄

select *,avg(age) over(partition by dept) as 平均年龄 from testfunc order by id;

解释:另外添加一列,用于记录以分组到每个部门的窗口中,以deft为窗口分区,计算出每个部门的平均年龄

2.每位学生的总成绩

select s_id,sum(convert(score,double))as 总成绩 from sc group by s_id;

3.#以总成绩进行排名:窗口函数

dense_rank()是的排序数字是连续的、不间断。当有相同的分数时,它们的排名结果是并列的

select s_id,sum(convert(score,double))as 总成绩,

dense_rank() over(order by sum(convert(score,double))desc)as 排名

from sc group by s_id;

解释:指定总成绩为窗口分区,并且总成绩降序排序。再接着dense_rank()再一次排序

4.#每科目下的总成绩进行排名

select c_id,sum(convert(score,double))as 总成绩,

dense_rank() over(partition by c_id order by sum(convert(score,double)) desc)as 排名

from sc group by c_id;

解释:分组到c_id窗口,以总成绩的降序排列,对c_id窗口分区进行对每一行匹配,并且再一次排序

#以平均分降序排列成绩信息:

select *,avg(convert(score,double)) over(partition by s_id)as 平均成绩 from sc order by 平均成绩 desc;

#按总成绩进行降序排列

-- 若按学生总成绩进行降序排序

select *,sum(convert(score,double)) over(partition by s_id) as 总成绩 from sc order by 总成绩 desc;

-- 若按科目的总成绩进行排序

select *,sum(convert(score,double)) over(partition by c_id) as 总成绩 from sc order by 总成绩 desc;

5.-- 求每个访客每个月访问次数,和累计访问次数

select *from visitor;

select userId,month(visitDate)as 月,sum(visitCount)as 月访问次数 from visitor group by userId,月;

-- 月累计访问次数,月累计:sum(sum(visitCount))

select userId,month(visitDate)as 月,sum(visitCount)月访问次数,sum(sum(visitCount))over(partition by userId order by month(visitDate))as 该客户月累计次数

from visitor group by use9999rId,月 order by userId;

6.-- 尝试不使用窗口函数得到并列形式排名(1,2,2,4...)

select a.name ,a.subject ,max(a.score) 主成绩 ,count(b.name)+1 行统计值【排名】

from score a left join score b on a.subject =b.subject and b.score >a.score

group by a.name, a.subject order by a.subject ,主成绩 desc;

select * from books_goods;

7.-- 对同个类别【t_categor】的价格进行降序排序,并给与排名值(但是row_number()不会跳过重复序号)

select row_number() over(partition by t_category order by t_price desc)as 排名,t_category,t_name,t_price,t_upper_time

from books_goods;

8.rank() 序号函数

能够对序号进行并列排序,并且会跳过重复的序号,得到并列排名 --- 效果与 excel 中 rank.eq()类似

select rank() over(partition by t_category order by t_price desc)as 排名,t_category,t_name,t_price,t_upper_time

from books_goods;

dense_rank() 函数

DENSE_RANK()函数对序号进行并列排序,并且不会跳过重复的序号,比如序号为1、1、2。

select rank() over(partition by t_category order by t_price desc)as 排名,t_category,t_name,t_price,t_upper_time

from books_goods;

9.percent_rank() 分布函数

于计算分区或结果集中行的百分位数

percent_rank() 返回一个从0到1的数字

对于指定的行, percent_rank()计算行的等级减1,除以评估的分区或查询结果集中的行数减一

select percent_rank() over(partition by t_category order by t_price desc) as 排名百分位,

rank() over(partition by t_category order by t_price desc) as 排名,

t_category,t_name, t_price,t_upper_time

from books_goods;

即:当前的排名-1/当前的行量-1;

10.cume_dist() 分布函数

主用于查询小于或等于某个值的比例

-- 比如统计大于等于当前售价的产品数占总产品数的比例,其窗口函数中的排序为降序即可

select cume_dist() over(order by t_price desc) as 占比,

t_category,t_name, t_price,t_upper_time

from books_goods;

- 比如统计小于等于当前售价的产品数占总产品数的比例

select cume_dist() over(order by t_price asc) as 占比,

t_category,t_name, t_price,t_upper_time

from books_goods;

前后函数:lag(expr,n)/lead(expr,n)

11.现想查看统一组别中的价格差值

- 2、计算当前价格与上一个价格之间的差值

select *,t_price-pre_price as 差值 from(

#1、得到当前商品的前一个商品价格(价格先按低的排序)

select t_category_id t_category,t_name, t_price,

lag(t_price,1) over(partition by t_category order by t_price asc) as pre_price

from books_goods

) t

把over 后的窗口分组排序方式语句单独提出来,设置别名:w 【名字可自取】,同时将其可应用于多个窗口函数上

想要输出分组后的前一个价格和后一个价格

select t_category_id t_category,t_name, t_price,

lag(t_price,1) over h as pre_price ,

lead(t_price,1) over h as last_price

from books_goods

window h as (partition by t_category order by t_price asc);

12.首尾函数FIRST_VALUE(expr)/LAST_VALUE(expr)

头尾函数应用于:返回第一个或最后一个expr的值;

应用场景:截止到当前,按照日期排序查询当前最大的月收入【LAST_VALUE】 或最小月收入值【FIRST_VALUE】是多少

比如:按价格排序,查询每个类目中最低和最高的价格是多少,方便与后续计算当前书籍的价格与最大价格 或最小价格的差值(但是没有分组来返回值)

select t_category_id t_category,t_name, t_price,

first_value(t_price) over h as 最小价格 ,

last_value(t_price) over h as 最大价格

from books_goods

window h as (partition by t_category order by t_price asc );

但结果发现:last_value 的结果并没有按照我们所想的以当前分组的窗口表中的所有数据进行判断最大值的

原因:last_value默认统计范围是取当前行数据 与 当前行之前的数据做比较的

解决方案:over 中的排序 order by 条件后加上一个固定语句:rows between unbounded preceding and unbounded following ,也是前面无界 和 后面无界 之间的行比较

select t_category_id t_category,t_name, t_price,

first_value(t_price) over h as 最小价格 ,

last_value(t_price) over h as 最大价格

from books_goods

window h as (partition by t_category order by t_price asc rows between unbounded preceding and unbounded following);

13.请利用窗口函数找出每门学科的前三名【并列且连续的排名效果】

select t.* from(

select name,subject,score,dense_rank() over(partition by subject order by score desc) as 排名 from score

) t where t.排名 3;

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

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

相关文章

机器学习~从入门到精通(二)线性回归算法和多元线性回归

为什么要做数据归一化 一、数据归一化: 1.最值归一化 2.均值方差归一化import numpy as npX np.random.randint(1,100,size100) X X.reshape(-1,2) X.shape X np.array(X,dtypefloat) X[:,0] (X[:,0]-np.min(X[:,0]))/(np.max(X[:,0])-np.min(X[:,0])) X[:,1]…

HarmonyOS之sqlite数据库的使用

从API Version 9开始,鸿蒙开发中sqlite使用新接口ohos.data.relationalStore 但是 relationalStore在 getRdbStore操作时,在预览模式运行或者远程模拟器运行都会报错,导致无法使用。查了一圈说只有在真机上可以正常使用,因此这里…

ARM 1.12

norflash与nandflash的区别: 一、NAND flash和NOR flash的性能比较 1、NOR的读速度比NAND稍快一些。 2、NAND的写入速度比NOR快很多。 3、NAND的4ms擦除速度远比NOR的5s快。 4、大多数写入操作需要先进行擦除操作。 5、NAND的擦除单元更小,相应的擦除电…

前端下载文件流,设置返回值类型responseType:‘blob‘无效的问题

前言: 本是一个非常简单的请求,即是下载文件。通常的做法如下: 1.前端通过Vue Axios向后端请求,同时在请求中设置响应体为Blob格式。 2.后端相应前端的请求,同时返回Blob格式的文件给到前端(如果没有步骤…

【安全策略】前端 JS 安全对抗浏览器调试方法

一、概念解析 1.1 什么是接口加密 如今这个时代,数据已经变得越来越重要,网页和APP是主流的数据载体。而如果获取数据的接口没有设置任何的保护措施,那么数据的安全性将面临极大的威胁。不仅可能造成数据的轻易窃取和篡改,还可能…

ArcGIS Pro 标注牵引线问题

ArcGIS Pro 标注 模仿CAD坐标牵引线问题 右键需要标注的要素,进入标注属性。 选择背景样式 在这里有可以选择的牵引线样式 选择这一个,可以根据调整间距来进行模仿CAD标注样式。 此图为cad样式 此为调整后gis样式 此处可以调整牵引线的样式符号 …

基于springboot+vue的校园管理系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

【Vue】路由学习中遇到的BUG

目录捏 一、TypeError: Cannot read properties of undefined(reading self)问题描述:原因分析:解决方案: 二、error XXX is not defined no-undef问题描述:原因分析:解决方案: 三、Error: Cannot find module babel-…

交换机配置及网络测试

实验环境 拓扑图 Ip规划表 部门 主机数量 网络地址 子网掩码 网关 可用ip Vlan 市场部 38 192.168.131.0 255.255.255.0 192.168.131.1 2-254 11 研发部 53 192.168.132.0 255.255.255.0 192.168.132.1 2-254 12 财务部 9 192.168.133.0 255.255.255…

2023最新版IDEA 创建javaweb项目(图文详细)

2023 用idea搭建第一个javaweb入门项目 文章目录 2023 用idea搭建第一个javaweb入门项目前言一、javaweb简介二、快速入门1.新建一个java项目2.添加Web Application3.配置环境4.配置jar5.导入servlet,jsp jar包6.配置tomcat服务器7.测试 总结 前言 该教学主要针对各位刚刚接触…

docker干货分享-安装redis-只需四个命令即可

首先保证docker安装成功: 因为已经安装成功,所以截图只是成功后的每一步: 注意:如果不是root账户登录的服务器,每个命令前面都需要加上sudo 第一步:下载redis镜像 redis最好直接用最新版 docker pull red…

Github操作网络异常笔记

Github操作网络异常笔记 1. 源由2. 解决2.1 方案一2.2 方案二 3. 总结 1. 源由 开源技术在国内永远是“蛋疼”,这些"政治"问题对于追求技术的我们,形成无法回避的障碍。 $ git pull ssh: connect to host github.com port 22: Connection ti…