SQL-窗口函数

news2024/11/27 2:30:03

什么是窗口函数

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

窗口函数组成部分

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.coloradmin.cn/o/1393185.html

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

相关文章

顶顶通呼叫中心中间件自动外呼来电转人工显示被叫号码而不是显示路由条件 :一步步配置(mod_cti基于FreeSWITCH)

介绍 顶顶通呼叫中心中间件自动外呼来电转人工显示被叫号码而不是显示自动外呼的路由条件,可以是默认的被叫号码也可以改为显示指定的号码 一、显示默认被叫 1、配置拨号方案 打开ccadmin-》点击拨号方案-》找到进入排队-》配置跟图中一样的通道变量。修改了拨号…

一篇综述洞悉医学大型语言模型的原理,应用和挑战

在过去的一年中,随着 GPT-4、LLaMA、Mistral,PaLM 等先进技术的突飞猛进,大型语言模型(Large Language Models)已经引领全球人工智能进入了一个全新的基础模型时代,这一时代不仅开启了技术创新的新篇章&…

7.5 MySQL对数据的增改删操作(❤❤❤)

7.5 MySQL对数据的基本操作 1. 提要2. 数据添加2.1 insert语法2.2 insert 子查询2.3 ignore关键字 3. 数据修改3.1 update语句3.2 update表连接 4. 数据删除4.1 delete语句4.2 delete表连接4.3 快速删除数据表全部数据 1. 提要 2. 数据添加 2.1 insert语法 2.2 insert 子查询 …

【文档数据库】ES和MongoDB的对比

目录 1.由文档存储牵出的问题 2.什么是MongoDB? 3.ES和MongoDB的对比 1.由文档存储牵出的问题 本文或者说关于mongodb的这个系列文章的源头: 前面我们聊过了分布式链路追踪系统,在基于日志实现的分布式链路追踪的方式seluthzipkin中为了…

selenium爬虫爬取当当网书籍信息 | 最新!

如果对selenium不了解的话可以到下面的链接中看基础内容: selenium爬取有道翻译-CSDN博客 废话不多说了下面是代码并且带有详细的注释: 爬取其他类型的书籍和下面基本上是类似的可以自行更改。 # 导入所需的库 from selenium import webdriver from …

【C/C++】C/C++编程——C/C++简介

C 语言简介 C 语言是一种通用的、高效的编程语言,广泛用于软件开发。它最初由丹尼斯里奇(Dennis Ritchie)在 1972 年于贝尔实验室开发,用于重新实现 Unix 操作系统。C 语言以其简洁、高效、灵活和跨平台的特点而闻名。 C 语言的主…

JavaScript实现字符串首字母大写、翻转字符串、获取用户选定的文本

字符串首字母大写 使用 JavaScript 函数 capitalize 来将字符串的首字母大写&#xff0c;并将结果显示在网页上。以下是一个简单的 HTML 使用案例&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><…

解决iCloud备份显灰问题的完全指南

目录 ​编辑 引言 问题背景 可能的原因 1 网络连接问题 2 ICloud账户异常 3 存储空间不足 4 备份设置问题 5 iOS版本问题 解决方法 3.1 检查网络连接 3.2 检查ICloud账户 3.3 检查存储空间 3.4 检查备份设置 3.5 更新iOS版本 3.6 重启设备 3.7 重置ICloud设置 …

VUE 中的 v-for 和 v-if 是否可以共存

VUE 中的 v-for 和 v-if 是否可以共存 前言1、面试经2、正确回答3、总结总结&#xff1a; 前言 要成功&#xff0c;先发疯&#xff0c;头脑简单往前冲&#xff01; 三金四银&#xff0c;金九银十&#xff0c;多学知识&#xff0c;也不能埋头苦干&#xff0c;要成功&#xff0c…

muduo网络库剖析——监听者Poller基类

muduo网络库剖析——监听者Poller基类 前情从muduo到my_muduo 概要框架与细节成员函数使用方法 源码结尾 前情 从muduo到my_muduo 作为一个宏大的、功能健全的muduo库&#xff0c;考虑的肯定是众多情况是否可以高效满足&#xff1b;而作为学习者&#xff0c;我们需要抽取其中…

物联网与智慧城市的无界未来:如何打破传统束缚,开启智能生活新篇章

目录 一、物联网&#xff1a;连接万物的技术革命 1、物联网的发展历程 2、物联网的核心技术 二、智慧城市&#xff1a;未来城市的蓝图与挑战 1、智慧城市的蓝图 2、智慧城市建设面临的挑战 3、应对挑战的措施 三、物联网与智慧城市的融合&#xff1a;打破传统束缚&…

ARM 1.12

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

ArcGIS Pro 标注牵引线问题

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

SpringBoot中整合MybatisPlus快速实现Mysql增删改查和条件构造器

场景 Mybatis-Plus(简称MP)是一个Mybatis的增强工具&#xff0c;只是在Mybatis的基础上做了增强却不做改变&#xff0c;MyBatis-Plus支持所有Mybatis原生的特性&#xff0c; 所以引入Mybatis-Plus不会对现有的Mybatis构架产生任何影响。MyBatis 增强工具包&#xff0c;简化 C…

如何绘制出图像的色素分布直方图

效果 如图&#xff0c;可以展示出我们的图像的颜色分布直方图,表明的图像的亮和暗 实现可视化色素分布直方图方法 这里我们对我们的灰色图片和彩色图片进行了直方图显示 import cv2 import matplotlib.pyplot as plt image cv2.imread("test.jpg") # 彩色图片->…

Baumer工业相机堡盟工业相机如何联合NEOAPI SDK和OpenCV实现Mono12和Mono16位深度的图像保存(C#)

Baumer工业相机堡盟工业相机如何联合BGAPI SDK和OpenCVSharp实现Mono12和Mono16位深度的图像保存&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机保存位深度12/16位图像的技术背景代码案例分享1&#xff1a;引用合适的类文件2&#xff1a;NEOAPI SDK联合OpenCV进行图…

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

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

Kafka-消费者-Consumer Group Rebalance设计

在同一个Consumer Group中&#xff0c;同一个Topic的不同分区会分配给不同的消费者进行消费&#xff0c;那么为消费者分配分区的操作是在Kafka服务端完成的吗?分区是如何进行分配呢?下面来分析Rebalance操作的原理。 方案一 Kafka最开始的解决方案是通过ZooKeeper的Watcher…

【文本到上下文 #2】:NLP 的数据预处理步骤

一、说明 欢迎阅读此文&#xff0c;NLP 爱好者&#xff01;当我们继续探索自然语言处理 (NLP) 的广阔前景时&#xff0c;我们已经在最初的博客中探讨了它的历史、应用和挑战。今天&#xff0c;我们更深入地探讨 NLP 的核心——数据预处理的复杂世界。 这篇文章是我们的“完整 N…

c/c++的指针函数与函数指针

函数 定义&#xff1a; 函数是数学中的一个概念&#xff0c;它是定义在某个数集上的一个特殊的映射关系。函数将输入值&#xff08;或自变量&#xff09;映射到输出值&#xff08;或因变量&#xff09;。函数的输入和输出可以是任何类型的数据&#xff0c;如数字、字符串、数组…