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开窗函数相关推荐

  1. 【PostgreSQL】使用开窗函数获取历史表最新记录 及 MySQL 旧版本实现

    文章目录 1. 前言 2. 需求与实现 2.1 实现说明 2.2 ROW_NUMBER () 的限制 2.2.1 RANK() 实现 2.2.2 RANK() 的限制 2.2.3 DENSE_RANK ...

  2. mysql开窗函数_魔幻的SQL开窗函数,为您打开进阶高手的一扇天窗

    经常写SQL脚本的朋友,通常会有一种迷之自信,似乎各种问题都有自己的一套解决方案.时间长了,人的思维可能会逐渐固化.思维固化能提高工作效率,但从某些角度看是很可怕的,我们也同时会失去接受新知识的内在动 ...

  3. 2021年大数据Hive(七):Hive的开窗函数

    全网最详细的Hive文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 系列历史文章 前言 Hive的开窗函数 一.窗口函数 ROW_NUMBER,RANK ...

  4. oracle 开窗子句,分析函数和开窗函数

    分析函数 分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计值 分析函数和聚合函数的区别 普通的 ...

  5. oracle之分析函数 开窗函数,Oracle之分析函数、开窗函数

    一.rank() over(partition by 字段1 order by 字段2) 从最经典的一个例子来说: 这是原始表结构: 现在需要增加一列,用来统计每天不同城市的完成率排名. 这意味着要对 ...

  6. Spark 开窗函数

    row_number() 开窗函数是按照某个字段分组,然后取另一字段的前几个的值,相当于 分组取topN 如果SQL语句里面使用到了开窗函数,那么这个SQL语句必须使用HiveContext来执行,H ...

  7. oracle之分析函数over及开窗函数

    2019独角兽企业重金招聘Python工程师标准>>> 一:分析函数overOracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是对于 ...

  8. oracle中over 语法,Oracle语法之OVER(PARTITIONBY..)及开窗函数

    Oracle的分析函数over 及开窗函数一:分析函数overOracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚 Oracle的分析函数over 及开窗函数 一:分析 ...

  9. MySQL——开窗函数

    结合order by关键词和limit关键词是可以解决很多的topN问题,比如从二手房数据集中查询出某个地区的最贵的10套房,从电商交易数据集中查询出实付金额最高的5笔交易,从学员信息表中查询出年龄最 ...

最新文章

  1. centos io 查看程序_centos 查看每天应用程序的iowait
  2. Interview:算法岗位面试—11.15下午上海某航天***公司(国企)技术面之工业机器视觉认知、计算机视觉算法的理解、目标检测相关项目案例
  3. ubuntu date -R查看时区
  4. java编程东西好多记不住_课程总结
  5. Elasticsearch7.15.2 ik中文分词器 定制化分词器之扩展词库(远程)
  6. transform: translate()
  7. 如何全面认识大数据分析的基础知识
  8. 计算机导论大一知识点整理_电网计算机类考试?悄悄告诉你一个复习攻略!
  9. Atitit。Time base gc 垃圾 资源 收集的原理与设计
  10. java.lang.NoClassDefFoundError: org/springframework/core/metrics/ApplicationStartup
  11. C#调用Qpdf的界面+拖拽pdf文件到窗口+解除pdf权限密码+另存为
  12. 不等式计算机在线使用,不等式传递性在线计算器
  13. 草料生成app自动下载的二维码
  14. web前端期末大作业——HTML+CSS简单的旅游网页设计与实现
  15. php 修改word内容,php如何替换word内容
  16. MySQL RR隔离级别解决幻读问题?
  17. 智慧工厂之化工厂人员定位系统,工厂实时定位,视频联动-新导智能
  18. OllyDbg 常用快捷键与命令
  19. 神奇的手指——可以取代”切水果“的清屏小软件
  20. Python习题十一

热门文章

  1. 精通scrapy网络爬虫·刘硕
  2. 几行代码制作一个简易计算机
  3. @Scheduled cron 定时任务表达式含义用法及* ?的区别
  4. EMNLP'22 Findings | 南大提出:从文本视角探究多模态预训练模型的语义对齐能力...
  5. OpenCV学习(21) Grabcut算法详解
  6. Oauth2.0的安全运行是否必须使用Https协议?官方总结的安全问题有哪些?(附英文文档分析)
  7. 详解如何用python批量采集今日头条信息流数据
  8. PHP 零基础入门笔记(2):安装PHP
  9. 首师大附中集训第四天:杂
  10. 毕业设计-基于深度学习的图像检索系统