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.mzph.cn/news/632518.shtml

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

相关文章

拼多多无货源中转仓项目真的靠谱吗?发展前景如何?

阿阳最近一直在关注无货源电商这一块,尤其是拼多多无货源中转仓, 现如今也有了自己的运营团队和交付团队,整体来看这个项目还算不错! 说实话,在考察这个项目的时候,看到市面上很多人在做,包括我…

一、VTK 9.0.0 编译安装步骤 VS2019 CMake3.26.0

零基础开始学习VTK ,请跟我进行第一步,配置好开放环境! 首先,你时间比较紧急,想直接使用VTK ,而无需编译、那么请使用 PCL-1.12.0-AllInOne-msvc2019-win64.exe 它已经帮你编译好VTK 9 了,直…

echarts柱状图顶部设置倾斜并且展示数字

将下面代码直接复制粘贴在此运行就能查看效果Apache ECharts,一款基于JavaScript的数据可视化图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。https://echarts.apache.org/examples/zh/editor.html?care…

AI制作《流浪地球3》高清宣传片

AI制作《流浪地球3》高清宣传片 星辰大海,再次启航,人类的冒险,永无止境。The vast expanse of stars and oceans, setting sail once again. Human adventure knows no bounds. 当家园变得遥不可及,我们唯有勇往直前。With our …

Docker部署Dubbo-Admin浏览器无法访问问题!

Dubbo配置开发环境 很多小伙伴在使用docker部署Dubbo-Admin会出现浏览器无法访问问题,但是虚拟机防火墙都是关着的,那么这可能是镜像源出现问题了,可以按照如下方法操作: 先将现有的镜像和容器全部删除(配置完镜像源需…

[Python] 如何通过ctypes库来调用C++ 动态库 DLL?

ctypes库介绍 ctypes是Python的一个外部库,它提供了一种灵活的方式来调用C语言的动态链接库(DLL)或共享库(SO)。通过ctypes,我们可以在Python中直接调用C语言编写的函数和变量,从而实现跨语言的互操作。 ctypes 它提供了与 C 兼容的数据类型,并允许调用 DLL 或共享库中的…

【Internet Protocol】ip介绍,如何组局域网实现远程桌面和文件共享

文章目录 1.何为“上网”1.1 定义1.2 为什么连了WiFi就能上网了? 2.ip2.1 什么是ip2.2 为什么区分广域网和局域网,ip的唯一性2.3 如何查看设备的ip2.4 什么叫"ping"2.5 区分是否两个ip是否在同一局域网2.5.1 最稳妥的方式:ip&m…

第 2 章 数据结构和算法概述

文章目录 2.1 数据结构和算法的关系2.2 看几个实际编程中遇到的问题2.2.1 问题一-字符串替换问题2.2.2 一个五子棋程序2.2.3 约瑟夫(Josephu)问题(丢手帕问题)2.2.4 其它常见算法问题: 2.3 线性结构和非线性结构2.3.1 线性结构2.3.2 非线性结构 2.1 数据结构和算法的关系 数据 …

Javascript,到底要不要写分号?

小白随机在互联网上乱丢一些赛博垃圾,还望拨冗批评斧正。 要不要加分号? 先说结论:“不引起程序出错的前提下,加不加都可以,按自身习惯来。” 为什么JS可以不加分号? 实际上,行尾使用分号的风…

五、基础篇 vue列表渲染

在v-for里使用对象用 v-for 把一个数组对应为一组元素 我们可以用 v-for 指令基于一个数组来渲染一个列表。v-for 指令需要使用 item in list形式的特殊语法&#xff0c;其中 list是源数据数组&#xff0c;而 item 则是被迭代的数组元素的别名。 <template><div clas…

【leetcode题解C++】54.螺旋矩阵I and 59.螺旋矩阵II

54.螺旋矩阵I 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5]示例 2&#xff1a; 输入&#xff1a;m…

C# 实现单线程异步互斥锁

文章目录 前言一、异步互斥锁的作用是什么&#xff1f;示例一、创建和销毁 二、如何实现&#xff1f;1、标识&#xff08;1&#xff09;标识是否锁住&#xff08;2&#xff09;加锁&#xff08;3&#xff09;解锁 2、异步通知&#xff08;1&#xff09;创建对象&#xff08;2&a…

Python单元测试之pytest的使用

一、前提准备 1、前提&#xff1a;需要安装pytest和pytest-html(生成html测试报告&#xff09; pip install pytest 和 pip install pytest-html 安装插件&#xff1a;pip install 插件名 2、命名规范 Pytest单元测试中的类名和方法名必须是以test开头,执行中只能找到test开…

Spring(19) ThreadPoolTaskExecutor 线程池的使用

目录 一、线程池简介1.1 为什么使用线程池1.2 线程池为什么需要使用队列1.3 线程池为什么要使用阻塞队列而不是用非阻塞队列1.4 如何配置线程池1.5 execute() 和 submit() 方法 二、ThreadPoolTaskExecutor 线程池简介2.1 简介2.2 核心参数配置2.3 ThreadPoolTaskExecutor 内部…

数据库作业三

1.创建student和score表 2.为student表和score表增加记录 3.查询student表的所有记录 4.查询student表的第2条到4条记录 5.从student表查询所有学生的学号&#xff08;id&#xff09;、姓名&#xff08;name&#xff09;和院系&#xff08;department&#xff09;的信息 6.从st…

flutter3使用dio库发送FormData数据格式时候的坑,和get库冲突解决办法

问题描述 问题1&#xff1a;当你使用FormData.from(Flutter3直接不能用)的时候&#xff0c;可能会提示没有这个方法&#xff0c;或者使用FormData.fromMap(flutter3的dio支持)的时候也提示没有&#xff0c;这时候可能就是和get库里面的Formdata冲突了 问题1&#xff1a;The me…

vue基于spring boot框架的发艺美发店理发店管理系统的设计q9xpe

店铺信息、美发信息是发艺美发店管理系统的重要组成部分&#xff0c;信息清晰、详细、准确&#xff0c;能够有效地促进发艺美发店管理系统的运行[5]。基础设定函数是对整个系统的总体布局进行合理安排&#xff0c;包括&#xff1a;店铺活动、物品信息、领用信息等。通过对各类资…

【C++】vector模拟实现过程中值得注意的点

Hello大家好&#xff01;我是咕噜的铁蛋&#xff01;C中的vector是一种动态数组&#xff0c;它能够根据需要自动增长和缩小。虽然C标准库已经为我们提供了vector的实现&#xff0c;但在某些情况下&#xff0c;我们可能需要自己模拟实现一个类似于vector的数据结构。今天铁蛋将给…

CPU密集型计算、IO密集型计算、多进程、多线程

参考链接&#xff1a; 使用多进程multiprocessing模块加速程序的运行_哔哩哔哩_bilibili 什么是CPU密集型计算、IO密集型计算&#xff1a; CPU密集型&#xff1a; CPU密集型也叫计算密集型&#xff0c;是指I/O在很短的时间就可以完成&#xff0c;CPU需要大量的计算和处理&a…

javaweb学习day01(HTML)

一、B/S 软件开发架构简述 1 Java Web 技术体系图 2 B/S 软件开发架构简述 B/S架构 前端 后端 数据库 二、HTML 1 官方文档 地址: https://www.w3school.com.cn/html/index.asp 离线文档: W3School 离线手册(2017.03.11 版).chm 2 网页 3 HTML 介绍 3.1 HTML 是什么…