当前位置: 首页 > news >正文

【PostgreSQL 17】11 窗口函数

直接这么写会报错,缺少GROUP BY

SELECTemployee_id,first_name,last_name,salary,AVG(salary)
FROM employees
;

image

添加OVER()

SELECTemployee_id,first_name,last_name,salary,AVG(salary) OVER()
FROM employees
;

image

定义

window_function (expression, ...) OVER (PARTITION BY ...ORDER BY ...frame_clause
)

分区选项 PARTITION BY

用于定义分区,作用类似于 GROUP BY

image

SELECTemployee_id,first_name,last_name,salary,department_id,AVG(salary) OVER(PARTITION BY department_id)
FROMemployees
;

排序选项 ORDER BY

指定分区内的排序方式

SELECTemployee_id,first_name,last_name,salary,department_id,RANK() OVER(PARTITION BY department_id ORDER BY salary DESC)
FROMemployees
;

image

窗口选项 frame_clause

在当前分区内指定一个计算窗口。
指定了之后,分析函数不再基于分区计算,而是基于窗口内的数据进行计算。

例题:1321. 餐馆营业额变化增长
计算以 7 天(某日期 + 该日期前的 6 天)为一个时间段的顾客消费平均值。

-- 外层查询:获取最终结果,包含日期、7天总营业额和平均营业额
SELECTDISTINCT visited_on,  -- 去重后的访问日期amount,               -- 子查询计算的7天累计营业额-- 计算7天平均营业额并保留2位小数ROUND(amount::NUMERIC / 7, 2) AS average_amount
FROM (-- 子查询:计算每个日期往前7天(含当天)的累计营业额SELECTvisited_on,-- 使用窗口函数计算滚动总和SUM(amount) OVER (ORDER BY visited_on  -- 按日期排序-- 定义窗口范围:当前行及之前6天(共7天)RANGE BETWEEN INTERVAL '6 days' PRECEDING AND CURRENT ROW) AS amountFROM Customer  -- 从顾客消费表获取数据
) t  -- 子查询别名
-- 过滤条件:只保留有完整7天数据的日期
-- 即当前日期减去6天后的日期必须存在于表中
WHERE visited_on - INTERVAL '6 days' IN (SELECT visited_on FROM Customer)
ORDER BY visited_on;  -- 按日期升序排列结果

参考资料

[1] 不剪发的Tony老师【PostgreSQL开发指南】第33节

http://www.hskmm.com/?act=detail&tid=13455

相关文章:

  • 商家列表管理与公众号二维码绑定​,方便对用户进行消息通知提醒
  • linux权限细化管理的三种方法:polkit sudoer doas做权限管理
  • mysql常用
  • 国产化Excel开发组件Spire.XLS教程:Python 写入 Excel 文件,数据写入自动化实用指南
  • Ansible的安装和使用
  • 数显LED驱动芯片恒流数码管驱动IC内置显示RAM为816位 VK16D33
  • 详细介绍:【TEC045-KIT】基于复旦微 FMQL45T900 的全国产化 ARM 开发套件
  • 【IEEE出版】2025年智慧物联与电子信息工程国际学术会议(IoTEIE 2025)
  • 9.22 机房练习
  • eslint
  • 视频调色神器!CyberLink ColorDirector:从入门到专业的视频色彩魔法工具
  • Leveraging Context-Aware Prompting for Commit Message Generation 论文笔记
  • P4951 [USACO01OPEN] Earthquake 题解
  • 用ida插件快速审计函数调用
  • 【ACM独立出版|往届已EI、Scopus检索|合作SSCI】第二届数字经济与计算机科学国际学术会议(DECS 2025)
  • schematool -initSchema -dbType mysql
  • PostgreSQL 全表 count 优化实践:从 SeqScan 痛点分析到 heapam 改进与性能突破
  • 第二章习题
  • Lightroom Classic 2025:精细调控,呈现完美画质,专业级数字照片管理与后期处理全解析
  • langfuse从v2.70.1升级到V3.110(异机升级+数据迁移)
  • 20250518_信安一把梭_医院抓取流量
  • tsx 图论选讲
  • OTP绕过漏洞:当后端过度信任前端时的安全灾难
  • 2MHz 8-bit 微控制器 with 64 Pins,M38049FFLKP ADR5040ARTZ TMS320F28062PZT K4AAG165WA-BCTD存储器
  • 实用指南:【Kubernetes】(六)Service
  • 校u圈校园外卖众包任务课表交友CPS社区:一站式校园生态服务系统
  • .NET Polly 全面指南:从5W2H维度深度解析
  • 撒钱岛小游戏管理系统:私域流量变现新选择,趣味与收益双赢
  • Day19构造器详解
  • 多商户的在线客服系统,直接在小程序的商家中嵌入我们的商家聊天链接