postgresql-窗口函数种类

news/2024/7/9 20:52:13 标签: postgresql, 数据库

postgresql-聚合窗口函数

  • 聚合函数
  • 排名窗口函数
    • 案例1
    • 案例2
  • 取值窗口函数
    • 环比增长率
    • 同比增长率

聚合函数

常用的聚合函数,例如 AVG、SUM、COUNT 等,也可以作为窗口函数使用

--计算移动平均值
select saledate, amount, avg(amount) over (order by saledate rows between 1
preceding and 1 following)
 from sales_data
where product = '桔子' and channel = '淘宝';

在这里插入图片描述

排名窗口函数

在这里插入图片描述

案例1

-- 计算员工部门薪资排名
select 
e.first_name,
e.last_name ,
e.department_id ,
e.salary,
row_number() over(partition by e.department_id order by e.salary),
rank() over(partition by e.department_id order by e.salary) ,
dense_rank() over(partition by e.department_id order by e.salary) ,
percent_rank()  over(partition by e.department_id order by e.salary) 
from employees e;

在这里插入图片描述
4 个窗口函数的 OVER 子句完全相同,此时可以采用一种更简单的写法

-- 计算员工部门薪资排名
select 
e.first_name,
e.last_name ,
e.department_id ,
e.salary,
row_number() over w,
rank() over w ,
dense_rank() over w ,
percent_rank()  over w 
from employees e
-- 定义窗口(在sql语句的最后)
window w as (partition by e.department_id order by e.salary)
;

案例2

-- 计算员工部门薪资排名
select 
e.first_name,
e.last_name ,
e.department_id ,
e.salary,
cume_dist() over w as "累积占比",
ntile(5) over w as "相对位置"

from employees e
-- 定义窗口(在sql语句的最后)
window w as (partition by e.department_id order by e.salary)
;

在这里插入图片描述

取值窗口函数

取值窗口函数用于返回指定位置上的数据。常见的取值窗口函数包括:

  • FIRST_VALUE,返回窗口内第一行的数据
  • LAST_VALUE,返回窗口内最后一行的数据
  • NTH_VALUE,返回窗口内第 N 行的数据
  • LAG,返回分区中当前行之前的第 N 行的数据
  • LEAD,返回分区中当前行之后第 N 行的数据
    其中,LAG 和 LEAD 函数不支持动态的窗口大小(frame_clause),而是以当前分区作为分析的窗口。
/*
 * first_value、last_value 以及 NTH 函数分别获取每个部门内部月薪最高、月薪最低以及月薪第三高的员工
 * */
select 
e.first_name,
e.last_name ,
e.department_id ,
e.salary ,
first_value(e.salary) over(partition by e.department_id order by e.salary),
last_value(e.salary) over(partition by e.department_id order by e.salary),
nth_value(e.salary,3) over(partition by e.department_id order by e.salary)
from employees e;

在这里插入图片描述

环比增长率

LAG 和 LEAD 函数同样用于计算销量数据的环比/同比增长

-- 首先,创建一个通用表表达式 sales_monthly,得到了不同产品每个月的销量汇总;
-- LAG(sum_amount, 1)表示获取上一期的销量;当前月份的销量减去上个月的销量,再除以上个月
-- 的销量,就是环比增长率
WITH sales_monthly AS (
 SELECT product, to_char(saledate,'YYYYMM') ym, sum(amount) sum_amount
 FROM sales_data
 GROUP BY product, to_char(saledate,'YYYYMM')
)
SELECT product AS "产品", ym "年月", sum_amount "销量",
 (sum_amount - LAG(sum_amount, 1) OVER (PARTITION BY product ORDER BY
ym))/
 LAG(sum_amount, 1) OVER (PARTITION BY product ORDER BY ym) * 100 AS "
环比增长率(%)"
 FROM sales_monthly
ORDER BY product, ym;

在这里插入图片描述

同比增长率

-- 2019年1月份数据 -2018年1月份数据,然后再和2018年1月份数据进行对比
-- 两年之间的相同月份
select 
s.*,
100*(s.amount - lag(s.amount,12) over(partition by s.product order by s.ym))
/ lag(s.amount,12 ) over(partition by s.product order by s.ym)  as "同比增长率"
from 
sales_monthly s;

在这里插入图片描述


http://www.niftyadmin.cn/n/5017210.html

相关文章

快来看看Python内置函数一览表

Python 解释器自带的函数叫做内置函数,这些函数可以直接使用,不需要导入某个模块。 如果你熟悉 Shell 编程,了解什么​ 是 Shell 内置命令,那么 ​你也很容易理解什么是 Python 内置函数,它们的概念是类似的。 将使用…

QT实战之翻金币游戏【未完待续】

文章目录 目录 文章目录 前言 二、创建项目 三、添加资源 四、主界面实现 1、设置游戏主场景配置 2、设置背景图片 3、创建开始按钮 总结 前言 对QT的相关知识与控件进行简单的学习之后,通过实现“翻金币游戏”来巩固与实践所学的QT知识。在制作过程中是根据以下视…

数据结构 - 栈

目录 二、栈的实现 1.数组模拟实现栈 设计思想: 方法实现: Peek(): 偷窥栈顶元素 pop(): 栈顶出栈 push(): 2.链表模拟实现 3 . 栈的继承体系 总结 前言 大家好,这篇博客带大家了解一下栈是什么? 并且用两种方式为大家实现一下栈 一、栈是什么? 栈是一种数…

PyCharm集成开发环境安装、启动与设置

作为非开发工程师职业,大家多多少少都会对编程有抵触,其实没有必要对Python有太大的“戒心" ,把Python当做你的一个工具就可以了。——扎克伯格 一、Python的定义: Python是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。Python的设计具有…

MIT 6.S081学习笔记(第一章)

〇、前言 本章主要是关于实验环境的搭建和完成 LAB UTIL。 平台:阿里云 Ubuntu20.04VScode on macOS(M1 Apple Silicon)。 一、环境搭建 1、QEMU QEMU(quick emulator)是一款由法布里斯贝拉(Fabrice Bel…

如何免费获取CDH集群技术支持

CDH拥有全球70% 的Hadoop用户,在国内也拥有庞大的用户群体。由于Cloudera 和Hortonworks 合并后厂商政策调整,不再更新、不再免费、不再提供服务,众多企业用户生产集群面临着进退两难的窘境和未知的技术风险。 社区版不再更新。Cloudera所有…

【学习笔记】「JOISC 2017 Day 3」自然公园

考虑对于一个点 x x x,找到它与当前连通块相连的所有边。我们希望通过 log ⁡ n \log n logn次询问确定一条边。 一般的策略是将数划分成两个大小相同集合然后去找答案,这里考虑 二分前缀,因为将点按照 D F N DFN DFN序排序,可以…

日志平台搭建第五章:Linux安装Kafka

相关链接 http://kafka.apache.org/downloads 1.使用Docker安装zookeeper 下载镜像: docker pull zookeeper:3.4.14 创建容器: docker run --name zookeeper \ -v /opt/data/zksingle:/data \ -p 2181:2181 \ -e ZOO_LOG4J_PROP"INFO,ROLLINGFILE&q…