开发指南—函数—窗口函数

简介: 传统的Group By函数会按照分组后的查询结果进行聚合计算,且每个分组只输出一条数据。但与传统的Group By函数不同,窗口函数(也称OLAP函数)可以为每个分组返回多个值,且不会影响记录的数量。本文介绍如何使用窗口函数

使用限制

  • 窗口函数仅支持用于SELECT语句中。
  • 窗口函数禁止与单独的聚合函数混合使用。例如,在如下语句中,SUM为聚合函数,且未与OVER关键字组合,因此您无法使用如下语句进行查询:
SELECT SUM(NAME),COUNT() OVER(...) FROM SOME_TABLE
  • 若需实现如上查询,您可以使用如下语句代替:
SELECT SUM(NAME),WIN1 FROM (SELECT NAME,COUNT() OVER(...) AS WIN1 FROM SOME_TABLE) alias

语法


function OVER ([[partition by column_some1] [order by column_some2] [RANGE|ROWS BETWEEN start AND end]])
参数 说明
function 该部分指定了窗口函数中支持的函数,取值范围如下:
  • 可以在窗口函数中结合OVER关键字使用如下聚合函数:
    • SUM()
    • COUNT()
    • AVG()
    • MAX()
    • MIN()
  • 专用窗口函数如下:
    • ROW_NUMBER()
    • RANK()
    • DENSE_RANK()
    • PERCENT_RANK()
    • CUME_DIST()
    • FIRST_VALUE()
    • LAST_VALUE()
    • LAG()
    • LEAD()
    • NTH_VALUE()

说明

  • 当使用专用窗口函数RANK()DENSE_RANK()时,窗口函数中的order by部分不可省略。更多专用窗口函数的介绍,请参见Window Function Descriptions
  • 支持如下专用窗口函数:
    • PERCENT_RANK()
    • CUME_DIST()
    • FIRST_VALUE()
    • LAST_VALUE()
    • LAG()
    • LEAD()
    • NTH_VALUE()
[partition by column_some1] 该部分指定了窗口函数的分区规范,用于将输入行分散到不同的分区中,过程和GROUP BY子句的分散过程相似。

说明partition by部分不支持引用复杂表达式,如您可以引用column_some1,但不可以引用column_some1 + 1

[order by column_some2] 该部分指定了窗口函数的排序规范,用于确定输入数据行在窗口函数中执行的顺序。

说明order by部分不支持引用复杂表达式,如您可以引用column_some2,但不可以引用column_some2 + 1

[RANGE|ROWS BETWEEN start AND end] 该部分指定了窗口函数的窗口区间,支持按照计算列值的范围(即RANGE)或计算列的行数(即ROWS)等两种模式来定义区间。

您可以使用BETWEEN start AND end指定边界的可取值,其中:

  • start取值范围如下:
    • CURRENT ROW:当前行
    • N PRECEDING:前N行
    • UNBOUNDED PRECEDING:直到第1行
  • end取值范围如下:
    • CURRENT ROW:当前行
    • N FOLLOWING:后N行
    • UNBOUNDED FOLLOWING:直到最后1行

使用示例

假设已有如下原始数据:


| year | country | product    | profit |
|------|---------|------------|--------|
| 2001 | Finland | Phone      |     10 |
| 2000 | Finland | Computer   |   1500 |
| 2001 | USA     | Calculator |     50 |
| 2001 | USA     | Computer   |   1500 |
| 2000 | India   | Calculator |     75 |
| 2000 | India   | Calculator |     75 |
| 2001 | India   | Calculator |     79 |
  • 您可以使用如下聚合函数来统计每个国家的总利润:
select
    country,
    sum(profit) over (partition by country) sum_profit
from test_window;
  • 返回结果如下:
| country | sum_profit |
|---------|------------|
| India   |        229 |
| India   |        229 |
| India   |        229 |
| USA     |       1550 |
| USA     |       1550 |
| Finland |       1510 |
| Finland |       1510 |
  • 您可以使用如下专用窗口函数将数据按照国家分组,并将国家内的产品按利润由小到大排名:
select
    'year',
    country,
    product,
    profit,
    rank() over (partition by country order by profit) as rank
from test_window;
  • 返回结果如下:
| year | country | product    | profit | rank |
|------|---------|------------|--------|------|
| 2001 | Finland | Phone      |     10 |    1 |
| 2000 | Finland | Computer   |   1500 |    2 |
| 2001 | USA     | Calculator |     50 |    1 |
| 2001 | USA     | Computer   |   1500 |    2 |
| 2000 | India   | Calculator |     75 |    1 |
| 2000 | India   | Calculator |     75 |    1 |
| 2001 | India   | Calculator |     79 |    3 |
  • 您可以使用如下带有ROWS命令的语句,查询根据当前窗口的每行数据计算利润部分的总和:
select 
    'year',
    country,
    profit,
    sum(profit) over (partition by country order by 'year' ROWS BETWEEN UNBOUNDED PRECEDING and CURRENT ROW) as sum_win 
from test_window;
  • 返回结果如下:
+------+---------+--------+-------------+
| year | country | profit |   sum_win   |
+------+---------+--------+-------------+
| 2001 | USA     |     50 |          50 |
| 2001 | USA     |   1500 |        1550 |
| 2000 | India   |     75 |          75 |
| 2000 | India   |     75 |         150 |
| 2001 | India   |     79 |         229 |
| 2000 | Finland |   1500 |        1500 |
| 2001 | Finland |     10 |        1510 |
相关文章
|
测试技术 Python
Playwright系列(4):录制测试脚本
Playwright系列(4):录制测试脚本
496 0
|
11月前
|
JSON API 开发者
深入研究:1688 拍立淘图片搜索 API 详解
本文介绍了 1688 拍立淘图片搜索 API 的功能与使用方法。该 API 支持开发者通过上传图片,在 1688 平台上搜索相似商品,返回商品标题、价格、销量等信息,适用于电商数据分析和商品推荐等场景。文章详细说明了接口的请求方式(HTTP POST)、参数(如 app_key、timestamp、sign 和 image)及 JSON 响应格式。此外,提供了 Python 请求示例代码,涵盖图片 Base64 编码、签名生成、发送请求及响应处理等步骤,帮助开发者快速集成与调试。
|
8月前
|
人工智能 数据可视化 前端开发
蚂蚁的可视化图表 MCP 首发上线!支持超过 25 种的可视化图表生成,也支持生成路书!
蚂蚁 AntV 团队推出可视化图表 MCP 插件,支持 25+ 种图表类型,涵盖统计图、关系图及地图标注、路径地图等,用户只需输入文本即可生成炫酷图表,大幅简化数据可视化流程,提升数据展示效率。
1295 23
|
存储 传感器
Landsat遥感影像数据的批量下载:USGS
本文介绍在USGS网站批量下载Landsat系列遥感影像的方法~
1362 1
Landsat遥感影像数据的批量下载:USGS
|
存储 SQL Apache
Apache Doris 创始人:何为“现代化”的数据仓库?
3.0 版本是 Apache Doris 研发路程中的重要里程碑,他将这一进展总结为“实时之路”、“统一之路”和“弹性之路”,详细介绍了所对应的核心特性的设计思考与应用价值,揭晓了 2025 年社区发展蓝图
879 6
Apache Doris 创始人:何为“现代化”的数据仓库?
|
小程序
智慧医院预约挂号平台源码,可直接线上预约挂号、快捷缴费,查看报告
医院线上预约挂号平台既可以让患者足不出户就可以利用微信进行在线挂号,实现分时段就诊,就诊后也可以直接使用手机微信缴费,还可以通过微信实现查询费用明细及药品清单,检查、检验报告,住院服务等功能。
497 1
智慧医院预约挂号平台源码,可直接线上预约挂号、快捷缴费,查看报告
|
存储 运维 数据挖掘
服务器数据恢复—修复xfs文件系统导致数据丢失的数据恢复案例
某公司一台服务器,连接了一台存储。该服务器安装linux操作系统,文件系统为xfs。 在运行过程中该服务器出现故障,管理员使用xfs_repair工具试图对xfs文件系统进行修复但失败,服务器中所有数据丢失。
|
Java Linux Maven
设置 Maven 环境变量
配置Maven环境变量涉及Windows、Linux和Mac。在Windows上,需新建系统变量`MAVEN_HOME`,值为Maven安装路径,编辑`Path`添加`%MAVEN_HOME%\bin`。在Linux中,下载解压Maven后移动到`/usr/local/`,编辑`/etc/profile`添加`MAVEN_HOME`和`PATH`。在Mac上,类似Linux操作,下载解压后移动到`/usr/local/`,编辑`/etc/profile`。最后,通过`mvn -v`检查是否安装成功。
|
分布式计算 API 云计算
|
机器学习/深度学习 监控 算法
OpenAI Gym 高级教程——深度强化学习库的高级用法
OpenAI Gym 高级教程——深度强化学习库的高级用法
1462 0

热门文章

最新文章