sql — 窗口函数

embedded/2024/10/18 16:54:28/

1. 基本介绍

1.1 窗口函数介绍

窗口函数是SQL中的一种强大工具,用于在查询结果中进行分析和计算。

与常规聚合函数不同,窗口函数可以在不影响查询结果集的情况下,对结果集中的每一行应用函数,生成额外的信息,例如排名、累计和等。这些函数可以根据定义的窗口范围动态地计算值,而不是像常规聚合函数那样对整个数据集进行计算。

窗口函数通常与OVER子句一起使用,OVER子句定义了窗口的范围,可以指定分区、排序规则等。

1.2 窗口函数分类

窗口函数可以分为排序窗口函数统计窗口函数两大类。

排序窗口函数主要用于对数据进行排序和排名,包括row_number、rank、dense_rank、percent_rank、ntile;

统计窗口函数则用于进行统计计算,包括count、sum、avg、min、max、first_value、last_value、lag、lead、cume_dist。

2. 样例数据

2.1 样例数据SQL

CREATE TABLE Sales (    id INT,    region VARCHAR(50),    amount DECIMAL(10, 2));
INSERT INTO Sales (id, region, amount) VALUES(1, 'North', 1000.50),(2, 'North', 1500.75),(3, 'South', 800.25),(4, 'West', 1200.00),(5, 'East', 2000.30);

3.各个窗口函数介绍

3.1 row_number()窗口函数

row_number函数为结果集中的每一行分配一个唯一的整数,按照指定的排序顺序进行排列。

SELECT id, region, amount, ROW_NUMBER() OVER (ORDER BY amount DESC) AS row_numFROM Sales;

图片

3.2 rank ()窗口函数

rank函数为结果集中的每一行分配一个排名,如果有相同数值,则会跳过相同排名并继续递增(不连续排名)

rank()函数的结果是:1, 2, 3, 3, 5, 6。

SELECT id, region, amount, RANK() OVER (ORDER BY amount DESC) AS rankFROM Sales;

图片

分区

RANK() OVER (PARTITION BY column ORDER BY column) AS rank_column

  • PARTITION BY 子句用于指定分区列,根据该列的值将数据分成不同的分区。
  • ORDER BY 子句用于指定排序列,根据该列的值对每个分区内的行进行排序。

3.3 dense_rank()窗口函数


dense_rank函数为结果集中的每一行分配一个排名,与rank函数类似,但是在遇到相同数值时,dense_rank不会跳过相同排名,而是连续分配相同的排名(连续排名)

dense_rank()函数的结果是:1, 2, 3, 3, 4, 5

SELECT id, region, amount, DENSE_RANK() OVER (ORDER BY amount DESC) AS dense_rankFROM Sales;

图片

3.4 percent_rank()窗口函数

percent_rank函数计算每一行在排序结果中的相对排名,返回一个介于0和1之间的小数值,用来表示行在排序结果中的相对位置。

SELECT id, region, amount, PERCENT_RANK() OVER (ORDER BY amount DESC) AS percent_rankFROM Sales;

图片

3.5 ntile(n)窗口函数

ntile函数将结果集分割成指定数量的桶,并为每个桶分配一个编号,确保每个桶中的行数量尽可能均匀。

SELECT id, region, amount, NTILE(2) OVER (ORDER BY amount DESC) AS ntileFROM Sales;

图片

3.6 count(*)窗口函数

 count函数计算结果集中行的数量,可以结合分组函数使用,用于统计分组内的行数。

SELECT id, region, amount, COUNT(*) OVER (PARTITION BY region) AS region_countFROM Sales;

图片

3.7 sum( ) 窗口函数

sum函数计算指定列的总和,并将结果添加到每一行。

SELECT id, region, amount, SUM(amount) OVER () AS total_salesFROM Sales;

图片

3.8 min() 窗口函数

min函数计算指定列的最小值,并将结果添加到每一行。

SELECT id, region, amount, MIN(amount) OVER () AS min_amountFROM Sales;

图片

3.9 max() 窗口函数

max函数计算指定列的最大值,并将结果添加到每一行。

SELECT id, region, amount, MAX(amount) OVER () AS max_amountFROM Sales;

图片

3.10 avg () 窗口函数

avg函数计算指定列的平均值,并将结果添加到每一行。

SELECT id, region, amount, AVG(amount) OVER () AS avg_amountFROM Sales;

图片

3.11 first_value () 窗口函数

first_value() 函数返回分组内的第一个值,并将其添加到每一行。

SELECT id, region, amount, FIRST_VALUE(amount) OVER (PARTITION BY region ORDER BY id) AS first_amountFROM Sales;

图片


http://www.ppmy.cn/embedded/21223.html

相关文章

彻底解决SimpleDateFormat的线程不安全问题

重现SimpleDateFormat类的线程安全问题 在Java中,SimpleDateFormat是一个非常常用的类,它用于将日期转换成需要的格式或者将文本日期转换为Date对象。然而,在多线程环境下使用SimpleDateFormat可能会遇到一些意想不到的问题。下面通过一个例…

DALL-E mini:在线可玩 - 文生图

简介:Craiyon 的前身是 DALL-E mini,它的灵感来自一个名为 DALL-E 的类似 AI 模型。随着时间的推移,Craiyon 改进了其模型,并添加了新功能,例如否定词和下一个提示建议。Craiyon 还有一个移动应用程序,您可…

3DTiles特性与内容解析

一篇19年整理的比较老的笔记了。更多精彩内容尽在数字孪生平台。 瓦片种类 3DTiles瓦片有多种类型: b3dm(Batched 3D Model,批量3D模型) b3dm瓦片存储了多个个体,b3dm中的glb代表的实际对象应该具有相同的种类但是可能数据内容不同。b3dm…

CC软件防火墙和WEB应用防火墙哪个好

本文将从CC软件防火墙的定义、原理、功能以及应用方面进行全面探讨,旨在加深对CC软件防火墙的理解,并推动网络安全意识的普及。以及WEB应用防火墙二者之间的对比。让用户更了解两个形态产品并作出选择。 第一部分:CC软件防火墙的定义和原理 …

聊聊.NET Core处理全局异常有那些方法

简述 处理全局异常的方法有IExceptionFilter(异常处理),使用中间件异常处理,使用框架自带异常中间件等。考点 考察对异常处理方式的熟悉程度和广度,以及对中间件、过滤器熟练程度。 下面分别具体介绍三种处理异常的…

买卖股票+跳跃游戏 贪心算法

买卖股票的最佳时机 只收集正利润即可&#xff01; class Solution {public int maxProfit(int[] prices) {int sum0;for(int i0;i<prices.length-1;i){if(prices[i1]-prices[i]>0){//只收集正利润sumprices[i1]-prices[i];}}return sum;} } 跳跃游戏 看覆盖范围&…

Axure中的样式

样式 首先说一下Axure里面的原点位置 如下图&#xff1a; 还有一个办法是我们选中我们的按钮&#xff0c;如上图&#xff0c;然后打开右边的样式&#xff0c;可以看按钮的x&#xff0c;y属性&#xff0c;类似于游戏中unity软件的x&#xff0c;y属性&#xff0c;类似于html中…

colab直接下载kaggle数据集

1.获取kaggle API Token account-settings-API&#xff0c;这时候会下载一个kaggle.json&#xff0c;然后将里面的内容{username:.......}复制一份 &#xff08;个人怕之后找不到另外放了一份到Google云端硬盘中&#xff09; 2.在colab中绑定kaggle !pip install -U -q kagg…