一、为什么要有窗口函数


我们直接用例子来说明,这里有一张学生考试成绩表testScore

现在有个需求,需要查询的时候多出一列subject_avg_score,为此科目所有人的平均成绩,好跟每个人的成绩做对比。

传统方法肯定是用聚合,但是写起来很麻烦也很累赘,这时候窗口函数就排上了用场。

因为窗口函数不会像聚合一样将参与计算的行合并成一行输出,而是将计算出来的结果带回到了计算行上。

二、窗口函数的使用


1、聚合和窗口函数的区别

聚合:聚合函数(sum,min,avg……) + GROUP BY

窗口函数:聚合函数(sum,min,avg……) + OVER ( …… )

2、使用

还用上面的例子:

(1) 取每个不同科目的平均值subject_avg_score [这正是上面提到的需求]

这里的 OVER 里用到了 PARTITION BY

SELECT *,
avg("score") OVER (PARTITION BY "subject") as "subject_avg_score"
FROM "testScore"

(2) 取所有成绩的平均值subject_avg_score

这里的 OVER 里为空

SELECT *,
avg("score") OVER () as "subject_avg_score"
FROM "testScore"

(3) 取此人该科目成绩班上排第几名subject_rank_score

这里的 OVER 里用到了 PARTITION BY + ORDER BY

ORDER BY 只能用在一些特殊的聚合函数里,比如这里的 rank()

SELECT *,
avg("score") OVER (PARTITION BY "subject") as "subject_avg_score",
rank() OVER (PARTITION BY "subject" ORDER BY "score" DESC) as "subject_rank_score"
FROM "testScore"

拓展知识:rank()、dense_rank()、row_number() 区别

rank() 最适合用来做排名的功能,它是若两人并列第一,那第三个人就排名第三

dense_rank() 跟 rank() 的区别是,若两人并列第一,那第三个人紧随其后排名第二

row_number() 则单纯是序号,所以不会出现多个人并列的情况。

(4) 提取 OVER 变量

如果在 sql 里写了很多重复的 OVER(),可以提取成一个 window 变量,简化代码。

SELECT *,
avg("score") OVER window_frame as "subject_avg_score",
avg("score") OVER window_frame as "subject_avg_score_2",
avg("score") OVER window_frame as "subject_avg_score_3"
FROM "testScore"
window window_frame as (PARTITION BY "subject")


参考资料

官方文档:http://www.postgres.cn/docs/9.3/tutorial-window.html

Postgresql窗口函数(一)

Postgresql窗口函数(二)

PostgreSQL 窗口函数 ( Window Functions ) 如何使用?的更多相关文章

  1. 16. 窗口函数 (Window Function) 的使用

    从SQL Server 2005起,SQL Server开始支持窗口函数 (Window Function),以及到SQL Server 2012,窗口函数功能增强,目前为止支持以下几种窗口函数: 1 ...

  2. MySQL 8.0.2: Introducing Window Functions

    July 18, 2017MySQL, SQLDag Wanvik MySQL 8.0.2 introduces SQL window functions, or analytic functions ...

  3. PostgreSQL>窗口函数的用法

    PostgreSQL之窗口函数的用法 转载请注明出处:https://www.cnblogs.com/funnyzpc/p/9311281.html PostgreSQL的高级特性本准备三篇的(递归. ...

  4. PostgreSQL窗口函数(转)

    转自:http://time-track.cn/postgresql-window-function.html PostgreSQL提供了窗口函数的特性.窗口函数也是计算一些行集合(多个行组成的集合, ...

  5. SQL Server Window Function 窗体函数读书笔记二 - A Detailed Look at Window Functions

    这一章主要是介绍 窗体中的 Aggregate 函数, Rank 函数, Distribution 函数以及 Offset 函数. Window Aggregate 函数 Window Aggrega ...

  6. PostgreSQL窗口函数

    窗口函数允许在查询的SELECT列表和ORDER BY子句中使用. 如果有排序,要保证唯一,否则会有下面的错误: 修改方式是:保证唯一,修改方法如下:

  7. postgresql 窗口函数排序实例

    经常遇到一种应用场景,将部分行的内容进行汇总.比较.排序. 比如数据表名称test.test2 select num,province from test.test2 得到结果: ;"黑龙江 ...

  8. 《SQL基础教程》+ 《SQL进阶教程》 学习笔记

    写在前面:本文主要注重 SQL 的理论.主流覆盖的功能范围及其基本语法/用法.至于详细的 SQL 语法/用法,因为每家 DBMS 都有些许不同,我会在以后专门介绍某款DBMS(例如 PostgreSQ ...

  9. Flink 的Window 操作(基于flink 1.3描述)

    Window是无限数据流处理的核心,Window将一个无限的stream拆分成有限大小的”buckets”桶,我们可以在这些桶上做计算操作.本文主要聚焦于在Flink中如何进行窗口操作,以及程序员如何 ...

随机推荐

  1. wpf 高DPI开发

    https://blog.walterlv.com/post/windows-high-dpi-development.html https://blog.csdn.net/ZslLoveMiwa/a ...

  2. 在 Laravel 中通过 Artisan View 扩展包创建及删除应用视图文件

    1.简介 本扩展包添加了两个视图相关的Artisan命令到Laravel应用,以便我们通过Artisan命令即可创建和管理视图文件,可谓是进一步解放了生产力. 2.安装 还是通过Composer安装: ...

  3. vs2015 生成 cordova 页面中文乱码

    原文:vs2015 生成 cordova 页面中文乱码 1.用VS2015新创建Cordova项目,启动运行index.html 中文显示乱码 解决方案: 1.使用text/html通用解析编码utf ...

  4. MugLife静态照片变3D动画算法研究

    原文:MugLife静态照片变3D动画算法研究 MugLife app是一款可以将静态照片变成3D动画的手机应用,如下效果图所示: 大家可以看到,这个静态图具有了类3D的动画特效,是不是很好玩? 这种 ...

  5. jquery.tmpl.js使用外部 jQuery Template文件

    $.get('/js/templates/filename.html', function(template) { $.tmpl(template, data).appendTo('#whatever ...

  6. ArcGIS for Desktop入门教程_第五章_ArcCatalog使用 - ArcGIS知乎-新一代ArcGIS问答社区

    原文:ArcGIS for Desktop入门教程_第五章_ArcCatalog使用 - ArcGIS知乎-新一代ArcGIS问答社区 1 ArcCatalog使用 1.1 GIS数据 地理信息系统, ...

  7. Android零基础入门第14节:使用高速Genymotion,跨入火箭时代

    原文:Android零基础入门第14节:使用高速Genymotion,跨入火箭时代 无论是使用Eclipse,还是Android Studio,使用自带的Android模拟器,不仅很费电脑内存,模拟器 ...

  8. 改善C#程序的建议1:非用ICloneable不可的理由

    原文:改善C#程序的建议1:非用ICloneable不可的理由 好吧,我承认,这是一个反标题,实际的情况是:我找不到一个非用ICloneable不可的理由.事实上,接口ICloneable还会带来误解 ...

  9. Android零基础入门第76节:Activity数据保存和横竖屏切换

    在前面几期学习了Activity的创建.配置.启动和停止,还学了Activity的生命周期,本期一起来学习Activity有关的更多事儿. 一.数据保存 通过上一期 LogCat 窗口打印的日志可以看 ...

  10. Qt在Mac OS X下的编程环境搭建(配置Qt库和编译器,有图,很清楚)

    尊重作者,支持原创,如需转载,请附上原地址:http://blog.csdn.net/libaineu2004/article/details/46234079 在Mac OS X下使用Qt开发,需要 ...