注:测试数据在 postgres —— 分组集与部分聚集 中

聚集将多行转变成较少、聚集的行。而窗口则不同,它把当前行与分组中的所有行对比,并且返回的行数没有变化。

组合当前行与 production 的均值

SELECT country, year, production,comsumption,
avg(production) over()
from t_oil;

  

1.分组

组合当前行与 按年份分组后,当前行所在分组的 production 的均值

SELECT country, year, production,comsumption,
avg(production) over(partition by year)
from t_oil;

组合当前行与 按年份>2000 分组后,当前行所在分组的 production 的均值

SELECT country, year, production,comsumption,
avg(production) over(partition by year > 2000)
from t_oil;

  

2.排序

组合当前行与 按年份排序后, 在当前 country 分组内, 到当前行为止 的 最小 production

SELECT country, year, production,
min(production) over (partition by country order by year)
from t_oil
where year between 1978 and 1983
and country in ('Iran', 'Oman')

注:可以看到,随着行数增加,最小值一直在改变。比如,到第5行为止时,最小值为 1321。

3.滑动窗口

① 移动窗口应与 order by 一起使用。此窗口的范围是当前行,当前行的前一行,当前行的下一行

SELECT country, year, production,
min(production) over
(PARTITION by country ORDER BY year ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)
from t_oil
WHERE year BETWEEN 1978 AND 1983
AND country IN ('Iran', 'Oman');

② 窗口的范围与上面一样。为上一行,当前行与下一行。注:array_agg 的作用是将范围内的该字段值转变成一个 postgresql 数组

SELECT *, array_agg(id) OVER
(ORDER BY id ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)
FROM generate_series(1, 5) as id;

③ 此窗口的范围是:当前行与当前行之前的行

SELECT *, array_agg(id) OVER
(ORDER BY id ROWS BETWEEN UNBOUNDED PRECEDING AND 0 FOLLOWING)
FROM generate_series(1, 5) as id;

④ 此窗口的范围是:当前行的前两行,当前行以及当前行之后的行

SELECT *, array_agg(id) OVER
(ORDER BY id ROWS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING)
FROM generate_series(1, 5) as id;

4.提取窗口子句

组合当前行,按年份排序后 到当前行为止 最小与最大的产量

SELECT country, year, production, min(production) OVER (w), max(production) OVER (w)
FROM t_oil
WHERE country = 'Canada' AND year BETWEEN 1980 AND 1985
WINDOW w AS (ORDER BY year);

5.使用内建窗口函数

四大排名函数

-- rank
SELECT year, production, rank() over (order by production)
from t_oil
where country = 'Other Middle East'
order by rank
limit 7; -- dense_rank
SELECT year, production, dense_rank() over (order by production)
from t_oil
where country = 'Other Middle East'
order by dense_rank
limit 7; -- ntile
SELECT year, production, ntile(4) OVER (order by production)
from t_oil
where country = 'Iraq'
and year between 2000 and 2006; -- row_number
select country, production, row_number() over (order by production)
from t_oil
limit 3;

  

233

postgres —— 窗口函数入门的更多相关文章

  1. postgres入门介绍

    mysql被oricle公司收购以后,PG就成了比较流行的开源数据库的首选,而且heroku上面不支持mysql,但是却大力支持PG,所以说,不得不学学PG,并非迫不得已的样子,至少以后PG会比较流行 ...

  2. SQL入门(2): Oracle内置函数-字符/数值/日期/转换/NVL/分析函数与窗口函数/case_decode

    本文介绍Oracle 的内置函数. 常用!  一. 字符函数 ASCII 码与字符的转化函数 chr(n)   例如 select chr(65) || chr(66) || chr(67) , ch ...

  3. 基础设施即代码(IAC),Zalando Postgres Operator UI 入门

    Postgres Operator UI 提供了一个图形界面,方便用户体验数据库即服务.一旦 database 和/或 Kubernetes (K8s) 管理员设置了 operator,其他团队就很容 ...

  4. Flink入门 - 窗口函数

    /* * ProcessWinFunOnWindow */ final StreamExecutionEnvironment streamExecutionEnvironment = StreamEx ...

  5. PostgreSQL入门

    这篇文章主要介绍我在最近工作中接触到的数据库PostgreSQL,做个入门记录,以便自己日后回顾. 1.下载安装,安装配置过程可以参考http://blog.chinaunix.net/uid-354 ...

  6. Laravel5.0学习--01 入门

    本文以laravel5.0.22为例. 生产环境建议使用laravel5.1版本,因为该版本是长期支持版本.5.1文档更详细:http://laravel-china.org/docs/5.1. 环境 ...

  7. Node.js 入门手册:那些最流行的 Web 开发框架

    这篇文章与大家分享最流行的 Node.js Web 开发框架.Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念.它的目标是帮助程序员构建高度可伸缩的应用程序,编 ...

  8. 《VC++ 6简明教程》即VC++ 6.0入门精讲 学习进度及笔记

    VC++6.0入门→精讲 2013.06.09,目前,每一章的“自测题”和“小结”三个板块还没有看(备注:第一章的“实验”已经看完). 2013.06.16 第三章的“实验”.“自测题”.“小结”和“ ...

  9. 2016 年开发者应该掌握的十个 Postgres 技巧

    [编者按]作为一款开源的对象-关系数据库,Postgres 一直得到许多开发者喜爱.近日,Postgres 正式发布了9.5版本,该版本进行了大量的修复和功能改进.而本文将分享10个 Postgres ...

随机推荐

  1. Git如何切换账户

    如果你不知道现在本地Git用的帐号是什么,你可以输入 git config user.name         查看用户名 git config user.email         查看用户邮箱 修 ...

  2. netty中的channelPipeline在编程中的作用

    在netty编程中我们绝大多数是要是用nio的,nio相比传统的io更加高效,而nio中核心概念离不开channel,buffer,selector三个重要的对象. 那么在netty中有一个chann ...

  3. Java设计模式--观察者模式到监听器

    观察者模式是对象的行为模式.又叫做发布-订阅模式.模型-视图模式.源-监听器模式. 抽象主题角色:主题角色将所有对观察者对象的引用到保存在一个集合里,每个主题都可以拥有任意数量的观察者.抽象主题提供一 ...

  4. identity server4

    dotnet new -i identityserver4.templates   添加模板

  5. 洛谷--P1028 数的计算(递推)

    题意:链接:https://www.luogu.org/problem/P1028 先输入一个自然数n (n≤1000) , 然后对此自然数按照如下方法进行处理: 不作任何处理; 在它的左边加上一个自 ...

  6. C程序编译和执行

    编译 & 执行 C 程序 首先准备一个源码文件 hello.c 键入如下代码: #include <stdio.h> int main() { /* 我的第一个 C 程序 */ p ...

  7. 《学渣Linux笔记》——更改ls命令的输出颜色和命令提示符颜色(二)

    <学渣Linux笔记>--更改ls命令的输出颜色和命令提示符颜色(二) II.更改命令提示符颜色 命令提示符的显示格式是由变量PS1决定的,首先我们查找GNU官方手册,发现如下内容(不是我 ...

  8. 有些CCS工程中为什么会有两个CMD文件?

    这里的CCS就是TI公司的Code Composer Studio 集成开发环境,所以这篇随笔也就是关于TI公司DSP开发过程中对于刚入门同学的一个常见问题了. 那作为一个初学者,对于CCS工程中的c ...

  9. 线程池及Executor框架

    1.为什么要使用线程池? ​ 诸如 Web 服务器.数据库服务器.文件服务器或邮件服务器之类的许多服务器应用程序都面向处理来自某些远程来源的大量短小的任务.请求以某种方式到达服务器,这种方式可能是通过 ...

  10. .Net Core WebApi(3)—NLog

    在.Net Core中,微软提供的内置的日志组件没有实现将日志记录到文件.数据库上.这里使用NLog替代内置的日志组件 1.在项目中引入NuGet包   NLog         NLog.Web.A ...