美文网首页
【Postgresql】查询分析——窗口函数

【Postgresql】查询分析——窗口函数

作者: 宅家学算法 | 来源:发表于2021-09-16 14:29 被阅读0次

  窗口函数作用于一个数据行集合。窗口是标准的SQL术语,用来描述SQL语句内OVER子句划定的内容,这个内容就是窗口函数的作用域。而在OVER子句中,定义了窗口所覆盖的与当前行相关的数据行集、行的排序及其他的相关元素。

1.排名函数:row_number/rank/dense_rank

  窗口函数中,排名函数是最常用的。窗口排序主要是指非全表排序,需要在某个维度下进行排序。例如说现在想看各个部门内部收入最多的人,这时候不能全表order by了,该怎么取?

select
    *,
    row_number() over ( partition by department order by revenue desc ) as row_number_result,
    rank() over ( partition by department order by revenue desc) as rank_result,
    dense_rank() over (partition by department order by revenue desc) as dense_rank_result
from
    table

row_number() 在排序相同时不重复,会根据顺序排序;
rank()排序相同时会重复,总数不会变,意思是会出现1、1、3这样的排序结果;
dense_rank() 排序相同时会重复,总数会减少,意思是会出现1、1、2这样的排序结果。

2. 排序函数(分区最大/最小值):first_value/last_value

  取分组内排序后,截止到当前行第一个/最后一个值

select
    *,
  first_value(name) over (PARTITION BY department ORDER BY revenue desc  ) as max_revenue_user, ## 分组取每个组的最大值对应的人
  last_value(name) over (PARTITION BY department ORDER BY revenue desc) as min_revenue_user ## 分组取每个组的最小值对应的人
from
    table

最后就会得到每个组里的revenue最多和最少的人

3. 分布函数(累积百分比):cume_dist / sum() over

  累积百分比的应用场景也很多,比如说,想看前XX%的用户贡献了XX%的总额。这个地方需要两个函数的使用,1是XX%的用户,2是XX%的总额。

select
    *,
    cume_dist() OVER (PARTITION BY department ORDER BY revenue desc) as cum_dist,
    cume_dist(revenue) OVER (PARTITION BY department ORDER by revenue desc)/sum(revenue) OVER (PARTITION BY department) as s
from
     table
where
    department = ‘HR'

最后可以得到HR部的revenue由高到低排序,XX%的人累积贡献了XX%多少。

4.偏移函数:lead/lag

  一般用于计算差值,最适用的场景是计算花费时间。举个例子,有数据是每个用户浏览网页的时间记录,将记录的时间错位之后,进行两列相减就可以得到每个用户浏览每个网页实际花费的时间。lead是用于统计窗口内往下第n行值,lag是用于统计窗口内往上第n行值。虽然目前我们这个数据不是时间数据,也可以使用这个函数操作一下。例如说,现在计算按revenue排序后,每个department的人他们的收入,以及和比他们花费排名更高一名的人的值,可以计算差值。

select *,
    lead(revenue) over(partition by department order by revenue) next_revenue
from 
    table


窗口偏移函数包括两种类型的函数,一种是偏移量是相对于当前行的,这个类别的包括LAG和LEAD函数;另一个类别函数的偏移量是相对于窗口框架的开始和结尾的,这个类别包括FIRST_VALUE、LAST_VALUE和NTH_VALUE。第一类别中的函数(LAG和LEAD)支持窗口分区子句以及窗口排序子句。当然,后者的存在赋予偏移量以逻辑意义。第二类别中的函数(FIRST_VALUE、LAST_VALUE和NTH_VALUE)在支持窗口分区子句和排序子句的基础上,还支持窗口框架子句。

相关文章

  • 【Postgresql】查询分析——窗口函数

      窗口函数作用于一个数据行集合。窗口是标准的SQL术语,用来描述SQL语句内OVER子句划定的内容,这个内容就是...

  • Hive常用函数

    一、窗口函数 1、窗口函数基础结构 窗口函数 = 分析函数 + over函数分析函数:sum ( )、max ( ...

  • 高级函数_分析函数与窗口函数

    高级函数_分析函数与窗口函数 分析函数往往与窗口函数一起使用,over()为窗口函数 一、分析函数 1.01、排名...

  • oracle学习笔记8: 分析函数

    分析函数,也称为窗口函数,通常被认为仅对数据仓库SQL有用。使用分析函数的查询,基于对数据行的分组来计算总量值。与...

  • Postgresql窗口函数(二)

    在上一篇里,主要窗口函数的基本用法。 在这一篇中,我们来看看postgresql除了聚合函数之外还支持哪些窗口函数...

  • Postgresql窗口函数(一)

    聚合函数大家都用过,像sum,min,avg等,一般是和group by配合使用。和聚合函数类似,窗口函数也是计算...

  • postgresql实战—窗口函数

    RETURNING返回更新后的数据 INSERT INTO ……RETURNING */id UPSERT:INS...

  • mysql8窗口函数(1)—语法

    窗口函数是针对查询的每一行,使用对应改行相关的行进行计算。大多数聚合函数也可以用作窗口函数。 窗口函数 窗口函数的...

  • Mysql中的窗口函数

    窗口函数初识 窗口函数也叫OLAP函数(Online Anallytical Processing,联机分析处理)...

  • Hive窗口分析函数

    1、概念 窗口分析函数:窗口函数也称为OLAP(OnlineAnalytical Processing)函数,是对...

网友评论

      本文标题:【Postgresql】查询分析——窗口函数

      本文链接:https://www.haomeiwen.com/subject/tsvrgltx.html