PG 窗口函数

news2025/2/28 12:39:01

一,简介

窗口函数也叫分析函数,也叫OLAP函数,通过partition by分组,这里的窗口表示范围,,可以不指定PARATITION BY,会将这个表当成一个大窗口。

二,应用场景

1)用于分区排序

2)动态Group By

3Top N

4)累计计算

5)层次查询

三,窗口函数的种类

窗口函数大体可以分为以下两种:

1、能够作为窗口函数的聚合函数( SUM AVG COUNT MAX MIN )。

2、RANK DENSE _ RANK ROW _ NUMBER 等专用窗口函数

专用窗口函数:

(1)RANK函数

RANK 函数
计算排序时,如果存在相同位次的记录,则会跳过之后的位次,
并且占位。
比如:有 3 条记录排在第 1 位时:1 位、1 位、1 位、4 ……

DENSE_RANK 函数
同样是计算排序,即使存在相同位次的记录,也不
会跳过之后的位次。
比如:3 条记录排在第 1 位时:1 位、1 位、1 位、2 ……

记得有一道面试图是排序成绩,会有人并列并列名次,这个场景就需要用到DENSE_RANK函数。

ROW_NUMBER 函数
赋予唯一的连续位次,
不会出现并列名次。
比如:3 条记录排在第 1 位时:1 位、2 位、3 位、4 ……

四,窗口函数语法

select ename,job,sal,
    rank() over (PARTITION BY job
                 ORDER BY  sal) as rankin
from emp; 

其中,可以把

    rank() over (PARTITION BY job
                 ORDER BY  sal) 

一块看,然后起了一个别名。

PARTITION BY 能够设定分组和排序的对象范围。

为了按照工作进行分组和排序,指定了job。ORDER BY 能够指定按照哪一列、何种顺序进行排序。为了按照工资的升序进行排列,我们指定了sal

五,使用范围:只能在SELECT 子句当中

六,作为窗口函数使用的聚合函数

(1)进行累积结果

如:

select ename,sal,
	SUM(sal) over (ORDER BY ename) as current_sum
from emp;

使用 SUM 函数时,并不像 RANK 或者 ROW _ NUMBER 那样括号中的内容为空,需要在括号内指定作为汇总对象的列。

七,指定框架(汇总范围)

select name,price,avg (price) over (order by name rows 2 preceding) as moving_avg from product;

这里我们使用了 ROWS (“行”)PRECEDING (“之前”)两个关键字,将框架指定为“截止到之前 ~ 行”,因此“ ROWS 2 PRECEDING ”就是将框架指定为“截止到之前 2 行”,也就是将作为汇总对象的记录限定为如下的“最靠近的 3 ”。

最靠近的3行=自身(当前记录)+ 之前第1行的记录 + 之前第2行的记录

八,计算移动平均

由于框架是根据当前记录来确定的,因此和固定的窗口不同,其范围会随着当前记录的变化而变化。这样的统计方法称为移动平均(moving average)。由于这种方法在希望实时把握“最近状态”时非常方便,因此常常会应用在对股市趋势的实时跟踪当中。

使用关键字 FOLLOWING (“之后”)替换 PRECEDING ,就可以指定“截止到之后 ~ 行”作为框架了。

如:计算移动平均同时指定前后行

select name,price,avg (price) over (order by name rows between 1 preceding and 1 following) as moving_avg from product;

九,两个order by

OVER 子句中的 ORDER BY 只是用来决定窗口函数按照什么样的顺序进行计算的,对结果的排列顺序并没有影响。在 SELECT 语句的最后,使用 ORDER BY子句进行指定按照 ranking 列进行排列,结果才会顺序显示,但是如果使用了,会打乱原本窗口函数出来的显示结果。

所以,一般来说,在窗口函数里面用了order by,外面就不要再用order by了。

十,实操

1.建表语句

CREATE TABLE
testdb=# create table product_sale_all(
year CHAR(25) NOT NULL, -- 年份字段,字符类型CHAR
product_name VARCHAR(100) NOT NULL, -- 产品名称,字符类型VARCHAR
product_category VARCHAR(32) NOT NULL, --产品所属类别,字符类型VARCHAR
sale_num INT -- 产品销售额总和,整数类型INT
);

2.插入测试数据

下面在dbeaver中操作;

3.计算总销售额

4.各产品类别的累积销售额

如果按照产品类别进行分组,按照销售额降序,求累计至当前产品的销售额order_sale_sum。

5.各产品类别产品数

6.各产品类别的平均销售额

6.各产品销售金额排名

7.窗口函数-位移

如果我们按产品类别进行分组,组内按照销售额进行逆序排序,针对每一行,计算销售额排名前1位lag_product 和后1位产品lead_product:

8窗口函数分箱

如果我们要对记录进行分箱,也就是把记录切分为机组,就要用分享箱函数ntile。

ntile(n) 可以奖数据按照顺序划分为N组,各个组有编号,编号从1开始,对于每一行,ntile返回此行所属的组的编号,ntile(2)表示将表切分为2组,ntile也可以在partition by 分组后分箱,表示对当前的组内进行分箱。

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

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

相关文章

LeeCode热题100(1)

本文纯干货,看不懂来打我! 自己先去看一下第一题的题目两数之和:. - 力扣(LeetCode) 简单来说就是让你在一个数组里面找两个数,这两个数的和必须满足等于目标值target才行。 我认为你要是没有思路的话&a…

【R语言基础】如何更新R版本

文章目录 概要流程细节具体步骤 概要 提示:由于软件包的更新,所以需要更新R至新版本 流程细节 查看当前R版本 R.version下载更新包:installr install.packages("installr")library(installr)跟着向导一步步执行安装 具体步骤 …

输入3个字符串,要求将字母按由小到大顺序输出

对于将3个整数按由小到大顺序输出,是很容易处理的。可以按照同样的算法来处理将3个字符串按大小顺序输出。可以直接写出程序。 编写程序: 运行结果: 这个程序是很好理解的。在程序中对字符串变量用关系运算符进行比较,如同对数值…

树形结构-CRUD接口

先看一下效果:整体的效果 新增效果 --默认值是 default 修改效果 - 大致效果如上 --------------------------------------------------------------------------------------------------------------------------------- 下面讲解代码如何实现的 根据你使用…

算法简单笔记4

5月31号,明天决赛,今天脑子也是一滩浆糊,踏马的一道题也做不出来,超级难受,只好简单复盘一下两道之前的题目,看完就差不多了,再学也没啥用了,写完这两题题解我就回去打把steam绝地求…

AI大模型的生命周期:从开发到退役的全面解析

前言 人工智能大模型(AI大模型)是当前AI领域的一大热点,它们具有强大的计算能力和广泛的应用前景。本文将全面介绍AI大模型的基础知识、训练过程、使用方法和应用场景。 一、初步了解AI大模型 AI大模型,通常指的是参数量达到亿…

k8s——Pod进阶(资源限制和探针)

一、资源限制 1.1 资源限制的定义 当定义Pod时可以选择性地为每个容器设定所需要的资源数量。 最常见的可设定资源是CPU和内存大小,以及其他类型的资源。 当为Pod中的容器指定了request资源时,调度器就使用该信息来决定将Pod调度到哪个节点上。当还为容器…

5.29工效学-人因工程人机交互

对于工效学这门课,一直都感觉很有意思,是一个值得再认真一点的课。可惜上课的时候效率不高,有感兴趣的东西课后也没有自行去拓展开来,前面的课我感觉还讲了比较重要的东西,但是,全忘了呢(真的对…

【C++】入门(二):引用、内联、auto

书接上回:【C】入门(一):命名空间、缺省参数、函数重载 文章目录 六、引用引用的概念引用的使用场景1. 引用做参数作用1:输出型参数作用2:对象比较大,减少拷贝,提高效率 2. 引用作为…

无忧易售ERP:解锁TikTok平台订单处理新效能,赋能跨境电商新未来

在这个全球化电商飞速发展的时代,TikTok作为新兴的电商蓝海,正吸引着无数商家的目光。然而,如何在竞争激烈的市场中脱颖而出,高效管理订单,提升顾客体验,成为每个商家必须面对的课题。无忧易售ERP&#xff…

uni-app+php 生成微信二维码 分销海报

主要代码如下,可直接复制调试参数: //查询当前用户是否有分销海报public function user_poster(){$this->checkAuth();//查询会员信息$user $this->getUserInfoById($this->user_id);if(!empty($user[distribution_img])){$result[data] $use…

一文搞懂分布式事务-Saga

Saga定义 Saga模式是一种分布式事务处理模式,用于保证分布式系统中的一系列操作要么全部成功执行,要么全部回滚,以实现一致性的目标。它采用了长事务的概念,将原子操作拆分为多个子事务,并通过补偿机制保证整个事务的…

Linux基本命令的使用(mkdir)

一、Linux必备命令之mkdir • mkdir命令主要用于创建目录 • 语法: mkdir [选项] 目录名称 若指定目录不存在则创建目录; 选项: -p,--parents 需要时创建目录的上层目录,若这些 目录已存在也不当作错误处理 二、Linux必备命令之…

成绩发布小程序哪个好用?

大家好,今天我要来跟大家分享一个超级实用的小秘密——易查分小程序!作为老师,你是不是还在为发放成绩而头疼?是不是还在为通知家长而烦恼?别急,易查分小程序来帮你啦! 易查分简直是老师们的贴心…

实战经验分享之移动云快速部署Stable Diffusion SDXL 1.0

本文目录 前言产品优势部署环境准备模型安装测试运行 前言 移动云是中国移动面向政府、企业和公众的新型资源服务。 客户以购买服务的方式,通过网络快速获取虚 拟计算机、存储、网络等基础设施服务;软件开发工具、运行环境、数据库等平台服务&#xff1…

活动选择问题(贪心法)

目录 问题概述 实例分析 代码实现 问题概述 实例分析 求解蓄栏保留问题。农场有n头牛,每头牛会有一个特定的时间区间[b,e]在蓄栏里挤牛奶,并且一个蓄栏里任何时刻只能有一头牛挤奶。现在农场主希望知道最少蓄栏能够满足上述要求,并给出每头牛被安排的方案。对于多种可行方案…

【算法】贪心算法简介

贪心算法概述 目录 1.贪心算法概念2.贪心算法特点3.贪心算法学习 1.贪心算法概念 贪心算法是一种 “思想” ,即解决问题时从 “局部最优” 从而达到 “全局最优” 的效果。 ①把解决问题的过程分为若干步②解决每一步时候,都选择当前最优解(不关注全局…

如何编写一份高质量的渗透测试报告?

随着网络安全威胁的不断扩展与升级, 渗透测试目前已经成为众多组织主动识别安全漏洞与潜在风险的关键过程。然而,渗透测试的真正价值在于为用户提交一份全面和可操作的渗透测试报告,这份报告不仅仅是一个技术性文档,同时也是促进安…

c语言基础:数组的运用以及在内存中的地址的理解

目录 目录: 1.数组作为函数参数 2.数组在内存中的存储 2.1数组名是什么? 2.2下面我们来探讨二维数组的各个名字表示什么 二维数组的首元素地址是什么呢? *arr表示的是什么呢 ?(arr是二维数组) 1.数组作…

纯分享#126个电商平台集合(包含60个不同国家)值得一看

01 亚洲 中国 淘宝:拥有大量的卖家和商品种类,主要面向中国市场。天猫:淘宝旗下的B2C电商平台,提供品质保证、正品保障的商品。京东:中国第二大B2C电商平台,提供品质保证、正品保障的商品。苏宁易购: 中国家电连锁巨头苏宁旗下的…