【sql高级】postgresql之窗口函数用法

1. 背景

窗口函数在在SQL中是非常有用的工具,特别是在需要对查询结果进行分析、排名、聚合或者对结果进行一些特定的计算时。以下是一些常见的场景:

  1. 排名和分组:窗口函数可以轻松地对结果集进行排名、分组和分区。例如,你可以使用 ROW_NUMBER()、RANK()、DENSE_RANK() 等函数来为每一行分配一个排名值,而不需要对查询结果进行额外的子查询或者连接操作。

  2. 移动平均和累计求和:窗口函数可以用来计算移动平均、累计求和或者其他一些基于窗口的聚合函数。这种功能对于时间序列分析或者趋势分析非常有用。

  3. Top N 查询:通过使用窗口函数,你可以很容易地实现Top N查询,即获取每个分组或者分区中前N个值。这在很多业务场景下都是非常有用的,比如获取每个类别的前几名产品。

  4. 比较当前行和前/后行:有些情况下,你可能需要比较当前行和前一行或者后一行的数据。窗口函数可以帮助你实现这样的需求,比如计算当前行与上一行的差值或者比率等。

  5. 处理重叠区间:在处理时间区间或者其他类型的重叠区间时,窗口函数可以帮助你轻松地识别和处理这些重叠的区间。

  6. 执行复杂的聚合操作:有时候,你可能需要对聚合操作的结果进行更复杂的处理,比如计算每个分组内的平均值,然后将每个值与该分组内的所有值进行比较。窗口函数可以帮助你在不增加额外的查询复杂度的情况下实现这些功能。

2. 使用举例

dim.dim_mltt_trading_sequence_i表中有如下数据:

使用窗口函数 ROW_NUMBER() 可以对sequence_id、unit_id、center_id这三个字段相同的数据进行排序(按id排序)

使用的sql如下:

sql 复制代码
select
    t7.*,
    ROW_NUMBER() OVER (PARTITION BY t7.sequence_id,
        t7.unit_id, t7.center_id ORDER BY t7.id) as rn
from
        dim.dim_mltt_trading_sequence_i t7;

输出结果如下:

相关推荐
实验室管理云平台3 分钟前
北京盛元广通检测管理方案:信息集成、质量控制与移动应用
大数据·数据库·科技
IT大白鼠9 分钟前
MySQL 高可用系列 · Orchestrator + ProxySQL 第三篇——核心原理精讲
数据库·mysql·架构
刘天远37 分钟前
Agent系统接入编排:评分模型、状态机与Python门禁
数据库·人工智能·python
DBA_G1 小时前
GBase数据库安全“全牌照“技术解读:从等保四级到全密态计算的实践
数据库
我滴老baby1 小时前
工业物联网数据库选型:把计算能力放回第一维度
数据库·人工智能·架构·pdf
Doris__HE2 小时前
【元脑服务器NF8260G7-NF8260M7技术规格分享】
运维·服务器·网络·数据库·性能优化
隔窗听雨眠2 小时前
SQL分页优化深度实战:从深分页性能瓶颈到等价改写完整方案
sql·sql优化
用户7531057124512 小时前
五年前我吐槽 PG 的 32 位 XID 是狗皮膏药,今天它被治好了
数据库
DBA_G2 小时前
从湖仓一体到AI原生:GBase数据库的金融全栈技术实践
数据库
ChenLuck2 小时前
32 位 XID 的“狗皮膏药”被撕掉了:金仓 V9 的 64 位事务号实测与底层拆解
数据库