PostGreSQL开窗函数
PostGreSQL开窗函数
语法
<窗口函数>
over(partition by 分组列 order by 排序列)
order by 并非必要
over() 是开窗函数的关键词
窗口函数存在哪些 ?
聚合类:sum() avg() max() min() count()
内置函数:RANK DENSE_RANK ROW_NUMBER等等
聚合类的窗口函数使用方法和平时使用相同
以sum()为例
id type name amount
1 1 liliya 3600
2 1 will 4500
3 2 hell 2350select
id,
name,
amount,
sum(amount)over(partiton by type) as total_amount结果
id name amount total_amount
1 liliya 3600 8100
2 will 4500 8100
3 hell 2350 2350
内置函数:RANK,DENSE_RANK,ROW_NUMBER
三者性质相同,都是对数据进行排序并且编号,不过结果存在些许的差异
以RANK为例
table name -> t1
id type name amount
1 1 liliya 3600
2 1 will 4500
3 2 hell 2350
4 1 oldman 2300
5 2 trueman 4610
6 2 ora 2350select
rank()over(partition by type order by amount desc),* from t1结果就是
rank id type name amount
1 2 1 will 4500
2 1 1 liliya 3600
3 4 1 oldman 2300
1 5 2 trueman 4610
2 3 2 hell 2350
3 6 2 ora 2350
RANK 使用结果有一个特点,就是若是排序的数据相同,则标记为并列,并且下一条数据的标记会 跳过标记相同的个数,进行标记 就比如并列第一的存在3个,name这三个标记为1 从第4个标记开始,标记为4 而非2
DENSE_RANK 则是不会跳过重复的个数,而是顺延标记。
ROW_NUMBER 不管重复,直接从1开始进行标记
开窗函数的使用,是因为group by 使用过程中,所select 的列都必须在group by中,这个会在实际中存在诸多麻烦,而开窗函数可以很好的避免此类情况。
同时开窗函数适用于TOPN 十分的方便
本人实际应用开窗函数的情况
table_name -> t1
自增ID 订单号 流水号 流水金额 流水收款日期
id order_id fina_id amount date
1 123 t1 30 2020-05-30
2 123 t2 100 2020-05-31
3 123 t3 500 2020-06-05
4 123 t4 70 2020-07-01需求:累计金额首次超过300 的那天标注为1
需求的结果表
order_id fina_id amount date sum_amount is_sign
123 t1 30 2020-05-30 30 0
123 t2 100 2020-05-31 130 0
123 t3 500 2020-06-05 630 1
123 t4 70 2020-07-01 700 0
SQL:
select
order_id,
fina_id,
amount,
date,
sum(amount)over(partition by order_id order by date) as sum_amount
case when sum(amount)over(partition by order_id order by date) >300 then 1 else 0 end as is_sign
from t1
此时得到的结果是
order_id fina_id amount date sum_amount is_sign
123 t1 30 2020-05-30 30 0
123 t2 100 2020-05-31 130 0
123 t3 500 2020-06-05 630 1
123 t4 70 2020-07-01 700 1
还未符合我们想要的结果
将上表 给个别名 t2
SQL:
select
order_id,
fina_id,
amount,
date,
sum_amount,
sum(is_sign)over(partition by order_id order by date) as sum_sign
from t2
此时得到的结果是:
order_id fina_id amount date sum_amount sum_sign
123 t1 30 2020-05-30 30 0
123 t2 100 2020-05-31 130 0
123 t3 500 2020-06-05 630 1
123 t4 70 2020-07-01 700 2
尚未符合要求 将上表命名别名 t3
select
order_id,
fina_id,
amount,
date,
sum_amount,
case when sum_sign = 1 then 1 else 0 end as is_sign
from t3
自此得到最终的结果表
order_id fina_id amount date sum_amount is_sign
123 t1 30 2020-05-30 30 0
123 t2 100 2020-05-31 130 0
123 t3 500 2020-06-05 630 1
123 t4 70 2020-07-01 700 0
之所以要这种形式,是因为要根据查询时间计算转化人数,当累计金额大于300时,才算上一次人数,而后其他则不再计算
这个方法是我个人所做,不知道有没有更加简便的方法,希望有更加简便方法的朋友,可以告知,谢谢
PostGreSQL开窗函数相关推荐
- 【PostgreSQL】使用开窗函数获取历史表最新记录 及 MySQL 旧版本实现
文章目录 1. 前言 2. 需求与实现 2.1 实现说明 2.2 ROW_NUMBER () 的限制 2.2.1 RANK() 实现 2.2.2 RANK() 的限制 2.2.3 DENSE_RANK ...
- mysql开窗函数_魔幻的SQL开窗函数,为您打开进阶高手的一扇天窗
经常写SQL脚本的朋友,通常会有一种迷之自信,似乎各种问题都有自己的一套解决方案.时间长了,人的思维可能会逐渐固化.思维固化能提高工作效率,但从某些角度看是很可怕的,我们也同时会失去接受新知识的内在动 ...
- 2021年大数据Hive(七):Hive的开窗函数
全网最详细的Hive文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 系列历史文章 前言 Hive的开窗函数 一.窗口函数 ROW_NUMBER,RANK ...
- oracle 开窗子句,分析函数和开窗函数
分析函数 分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计值 分析函数和聚合函数的区别 普通的 ...
- oracle之分析函数 开窗函数,Oracle之分析函数、开窗函数
一.rank() over(partition by 字段1 order by 字段2) 从最经典的一个例子来说: 这是原始表结构: 现在需要增加一列,用来统计每天不同城市的完成率排名. 这意味着要对 ...
- Spark 开窗函数
row_number() 开窗函数是按照某个字段分组,然后取另一字段的前几个的值,相当于 分组取topN 如果SQL语句里面使用到了开窗函数,那么这个SQL语句必须使用HiveContext来执行,H ...
- oracle之分析函数over及开窗函数
2019独角兽企业重金招聘Python工程师标准>>> 一:分析函数overOracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是对于 ...
- oracle中over 语法,Oracle语法之OVER(PARTITIONBY..)及开窗函数
Oracle的分析函数over 及开窗函数一:分析函数overOracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚 Oracle的分析函数over 及开窗函数 一:分析 ...
- MySQL——开窗函数
结合order by关键词和limit关键词是可以解决很多的topN问题,比如从二手房数据集中查询出某个地区的最贵的10套房,从电商交易数据集中查询出实付金额最高的5笔交易,从学员信息表中查询出年龄最 ...
最新文章
- centos io 查看程序_centos 查看每天应用程序的iowait
- Interview:算法岗位面试—11.15下午上海某航天***公司(国企)技术面之工业机器视觉认知、计算机视觉算法的理解、目标检测相关项目案例
- ubuntu date -R查看时区
- java编程东西好多记不住_课程总结
- Elasticsearch7.15.2 ik中文分词器 定制化分词器之扩展词库(远程)
- transform: translate()
- 如何全面认识大数据分析的基础知识
- 计算机导论大一知识点整理_电网计算机类考试?悄悄告诉你一个复习攻略!
- Atitit。Time base gc 垃圾 资源 收集的原理与设计
- java.lang.NoClassDefFoundError: org/springframework/core/metrics/ApplicationStartup
- C#调用Qpdf的界面+拖拽pdf文件到窗口+解除pdf权限密码+另存为
- 不等式计算机在线使用,不等式传递性在线计算器
- 草料生成app自动下载的二维码
- web前端期末大作业——HTML+CSS简单的旅游网页设计与实现
- php 修改word内容,php如何替换word内容
- MySQL RR隔离级别解决幻读问题?
- 智慧工厂之化工厂人员定位系统,工厂实时定位,视频联动-新导智能
- OllyDbg 常用快捷键与命令
- 神奇的手指——可以取代”切水果“的清屏小软件
- Python习题十一
热门文章
- 精通scrapy网络爬虫·刘硕
- 几行代码制作一个简易计算机
- @Scheduled cron 定时任务表达式含义用法及* ?的区别
- EMNLP'22 Findings | 南大提出:从文本视角探究多模态预训练模型的语义对齐能力...
- OpenCV学习(21) Grabcut算法详解
- Oauth2.0的安全运行是否必须使用Https协议?官方总结的安全问题有哪些?(附英文文档分析)
- 详解如何用python批量采集今日头条信息流数据
- PHP 零基础入门笔记(2):安装PHP
- 首师大附中集训第四天:杂
- 毕业设计-基于深度学习的图像检索系统