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;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Flutter 问题系列第 80 篇】TextField 输入框组件限制可输入的最大长度后,输入的内容中包含表情符号时,获取输入的内容数还是会超出限制的问题

这是【Flutter 问题系列第 80 篇】,如果觉得有用的话,欢迎关注专栏。 博文当前所用 Flutter SDK:3.10.5、Dart SDK:3.0.5 一:问题描述 在输入用户名称、简介等内容时,一般我们都会限制输入框内最大可输入…

深入解析JavaScript的原生原型

🧑‍🎓 个人主页:《爱蹦跶的大A阿》 🔥当前正在更新专栏:《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ ​ ✨ 前言 在JavaScript中,除了自定义对象,还存在很多由JavaScript语言本身提供…

vue3 知识

vue3介绍 Vue3的变化: 1、vue3完全兼容vue2,但是vue3不建议用vue2的写法 2、拥抱TypeScript,ts完全兼容js 3、组合式API和配置项API vue2 是配置项api vue3 组合式api vue3项目创建和启动 # 创建vue3项目&a…

C++创建窗口程序

实现一个基本的 Windows 应用程序&#xff0c;使用 C 和 WinAPI&#xff08;Windows API&#xff09;编写。运行这段代码时&#xff0c;它将显示一个标题为“Hello World”的窗口&#xff0c;并且可以通过关闭窗口来结束程序。 #include <windows.h> // 包含Windows头文…

【Python3】【力扣题】389. 找不同

【力扣题】题目描述&#xff1a; 【Python3】代码&#xff1a; 1、解题思路&#xff1a;使用计数器分别统计字符串中的元素和出现次数&#xff0c;两个计数器相减&#xff0c;结果就是新添加的元素。 知识点&#xff1a;collections.Counter(...)&#xff1a;字典子类&#x…

ONLYOFFICE:开源、免费、安全,打造定制化办公平台的最佳选择

文章目录 写在前面ONLYOFFICE是什么&#xff1f;ONLYOFFICE的惊艳之处齐全的插件&#xff0c;助你锦上添花部署一款自己的安全可靠的办公平台写在最后 写在前面 说起 Office 办公软件&#xff0c;我想大家最常用的应该就是微软的 Microsoft Office 以及国产的 WPS Office。两款…

C语言:进制转换以及原码、反码、补码

一、二进制 其实我们经常能听到2进制、8进制、10进制、16进制这样的讲法&#xff0c;那是什么意思呢&#xff1f;其实2进制、8进制、10进制、16进制是数值的不同表⽰形式⽽已。 比如&#xff1a; 数值15的各种进制的表⽰形式&#xff1a; 15的2进制&#xff1a;1111 15的8进…

HBuilder X中uView UI框架的安装及使用

开发工具: HBuilder X 在最上方的工具中点击 插件安装 ——> 安装新插件 ——> 前往插件市场安装 在作者排行榜中找到 uView UI 选择该版本 然后点击下载并导入HBuilder X 然后选择你想导入的项目 在项目根目录中的main.js中&#xff0c;引入并使用uView的JS库&#xff…

Java基础面试题(五)

Java基础面试题&#xff08;五&#xff09; 文章目录 Java基础面试题&#xff08;五&#xff09;标识符和关键字的区别是什么&#xff1f;Java 语言关键字有哪些&#xff1f;自增自减运算符移位运算符continue、break 和 return 的区别是什么&#xff1f; 单行注释&#xff1a;…

【软件设计】基于SSM的334考研图书电子商务平台

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

msvcr120.dll找不到要怎么处理?电脑文件msvcr120.dll修复攻略

在使用基于Windows操作系统的计算机的日常过程中&#xff0c;用户可能会遇到多种程序错误&#xff0c;其中之一就是“找不到msvcr120.dll”或者“msvcr120.dll丢失”的系统提示。这个问题往往在启动某些程序时发生&#xff0c;很让人无可奈何。为了解决这个问题&#xff0c;重要…

【Linux系统编程】环境变量的组织方式

environ和getenv函数 在Linux中&#xff0c;environ是一个全局的外部变量&#xff0c;其类型为char**&#xff0c;存储着系统的环境变量。除了使用主函数中的第三个参数外&#xff0c;我们也可使用environ函数直接访问系统的环境变量。 注意&#xff1a;这里在代码内部使用envi…

Spring Boot多环境配置

Spring Boot的针对不同的环境创建不同的配置文件&#xff0c; 语法结构&#xff1a;application-{profile}.properties profile:代表的就是一套环境 1.需求 application-dev.yml 开发环境 端口8090 application-test.yml 测试环境 端口8091 application-pro…

如何给新华网投稿发稿?新华网的媒体发稿方法步骤

现如今&#xff0c;互联网已经成为了人们获取信息的主要途径&#xff0c;各大媒体网站也成为了发布自己作品的首选平台。其中&#xff0c;新华网作为中国最具影响力的新闻媒体之一&#xff0c;其内容覆盖面广、触及人群众多&#xff0c;因此&#xff0c;能够在新华网上发表文章…

Tuxera NTFS2024下载使用详细操作教程

你是否还在为Mac不能正常读写NTFS格式分区而感到苦恼呢&#xff1f;想要适合Mac系统使用来回转换磁盘格式又十分麻烦&#xff0c;这该怎么办呢&#xff0c;有了这款软件Tuxera ntfs就能马上帮你解决目前遇到的问题。 Tuxera NTFS2024最新免费版下载如下&#xff1a; https://…

htb monitored root方式其中的一种(仅作记录)

快下班时候审出来的&#xff0c;目前root的第5种方式 nagiosmonitored:~$ cat /usr/local/nagiosxi/scripts/backup_xi.sh #!/bin/bash # # Creates a Full Backup of Nagios XI # Copyright (c) 2011-2020 Nagios Enterprises, LLC. All rights reserved. #BASEDIR$(dirname …

CentOS使用docker本地部署StackEdit Markdown编辑器并实现公网访问

文章目录 1. docker部署Stackedit2. 本地访问3. Linux 安装cpolar4. 配置Stackedit公网访问地址5. 公网远程访问Stackedit6. 固定Stackedit公网地址 StackEdit是一个受欢迎的Markdown编辑器&#xff0c;在GitHub上拥有20.7k Star&#xff01;&#xff0c;它支持将Markdown笔记保…

Linux:软硬链接的概念与应用

文章目录 软链接和硬链接软链接的应用场景硬链接的应用场景当前目录和上级目录总结 本篇要探讨的主题是关于软硬链接的概念 在Linux系统链接文件中有两种&#xff0c;一种是硬链接&#xff0c;一种是软链接&#xff0c;那么本篇就基于上述的两种链接方式来进行一定的总结和拓展…

IOS-UIAlertController简单使用-Swift

UIAlertControlle时IOS的对话框控制器&#xff08;警报控制器&#xff09;&#xff0c;简单使用方法如下&#xff1a; 步骤都一样&#xff0c;先是创建UIAlertController&#xff0c;然后创建UIAlertAction&#xff0c;再将UIAlertAction添加到UIAlertController中&#xff0c;…

Keil 的安装

Keil的安装&#xff0c;分3个主要步骤&#xff1a; ① 安装Keil软件 ② 注册 ③ 安装芯片支持包 一、安装 Keil 重点 1&#xff1a; 安装时&#xff0c;不能使用中文路径&#xff0c;否则无法正常使用!! 重点 2&#xff1a; 不要安装 V5.36 及以上的版本&#xff0c…