当前位置:网站首页 > Haskell函数式编程 > 正文

mysql窗口函数排序(mysql 排序函数)



1.窗口函数概述
窗口函数是一种SQL函数,非常适合于数据分析,其最大的特点就是:输入值是从SELECT语句的结果集中的一行或者多行的"窗口"中获取的,也可以理解为窗口有大有小(行数有多有少)。
通过OVER子句,窗口函数与其他的SQL函数有所区别,如果函数具有OVER子句,则它是窗口函数。如果它缺少了OVER子句,则他就是个普通的聚合函数。
窗口函数可以简单地解释为类似于聚合函数的计算函数,但是通过GROUP BY子句组合的常规聚合会隐去正在聚合的各个行,最终输出称为一行。但是窗口函数聚合完之后还可以访问当前行的其他数据,并且可以将这些行的某些属性添加到结果当中去。
下面可以通过两个图来区分普通的聚合函数和窗口函数

首先让我们先添加测试数据,并查看表。

我们可以看的出来,常规聚合函数把id进行分组然后把每组的薪资综合计算出来放在最后面。

我们可以通过这两个例子看出来,聚合函数和窗口聚合函数的区别。就是窗口函数会进行分组,但不会把行进行合并。对于每一组窗口函数返回出来的结果都会重复的放在最后面。

2.窗口函数的语法
Function(arg1,..., argn) OVER ([PARTITION BY <...>] [ORDER BY <....>] [<window_expression>])
对于以上的窗口函数的语法[ ]中的语法是可以根据自己的需求进行选择(非必须写入语法),并且此语法严格按照上面的顺序来规定。
Function(arg1,..., argn)是表示函数的分类,可以是下面分类中的任何一组。
----------聚合函数,例如sum,min,avg,count等函数(常用)
----------排序函数,例如rank row_number dense_rank()等函数(常用)
----------跨行函数,lag lead 函数
OVER [PARTITION BY <...>] 类似于group by 用于指定分组
--每个分组你可以把它叫做窗口
--不分组的情况可以写成partition by null 或者直接不写partition by,所有列为一个大组
--分组的情况下,partition by 后面可以跟多个列,例如partition by cid,cname
[ORDER BY <....>] 用于指定每个分组内的数据排序规则 支持ASC、DESC
[<window_expression>] 用于指定每个窗口中 操作的数据范围 默认是窗口中所有行
1.窗口函数语法解释-Function(arg1,..., argn)
通常和partition by分组使用。当然也可以不分组使用,但也不分组使用通常没有意义。
----------聚合函数,例如sum,min,avg,count等函数(常用)
----------排序函数,例如rank row_number dense_rank()等函数(常用)
----------跨行函数,lag lead 函数
1.聚合函数
我们还通过上文的测试数据进行演示。我们就演示2个函数,其他的聚合类函数都是相同的用法。
sum函数:求和

min函数 :最小值

其他的聚合函数都是同样的用法。

2.排序函数
rank row_number dense_rank()等函数,通常与order by函数一起使用。
row_number()函数:对分组之后按照某些规则从高到低或者从低到高进行排序(order by),然后打上序号,不考虑并列的情况。

rank()函数:对分组之后按照某些规则从高到低或者从低到高进行排序(order by),然后打上序号,考虑并列情况并且跳跃排名,对此我们需要增添一组数据。

dense_rank()函数:

3.跨行函数
LAG(col,n,DEFAULT) 用于统计窗口内往上第n行值
第一个参数为列名,第二个参数为往上第n行(可选,默认为1),第三个参数为默认值(当往上第n行为NULL时候,取默认值,如不指定,则为NULL);

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

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

从这个数据我们有个疑问,为啥不是去分组内的最后一个值呢?
在这里我给大家解释一下,对于我们分的窗口(比如部门id=1)里面还有个小窗口row函数
对于我们没有指定小窗口默认是当之前所有行到当前行,这样理解可以很抽象,我们举个例子。对于部门id=1来说,我们从第一行来看(心里默念从之前所有行到当前行)从之前所有行到当前行来看确实输出的值应该是55000.00,那么我们看第二行(心里默念从之前所有行到当前行)那么确实输出的是52000.00。这样我们通过row函数来改变一下小窗口的范围。更清晰的感受一下这个函数。

解释一下设置小窗口的含义:rows between unbounded preceding and unbounded following
之前所有的行到之后所有的行,那么让我们输出一下。

我们可以很清晰的看出来,输出的是每一组里面最后一个的薪资。

2.窗口函数语法解释-OVER [PARTITION BY <...>]
over是窗口函数的标志,partition by 用来指定分组,把partition by 后面跟的字段相同的放在一起

参考博客:https://blog.csdn.net/_/article/details/

到此这篇mysql窗口函数排序(mysql 排序函数)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • 密码加密的方式有哪些(密码的加密与解密的方式)2025-05-01 23:27:04
  • 摩斯密码加密方式(摩斯密码加密方式最全)2025-05-01 23:27:04
  • pivot函数oracle(pivot函数hive)2025-05-01 23:27:04
  • modbus RTU报文格式(modbus RTU报文格式怎么写入plc)2025-05-01 23:27:04
  • max的函数功能是什么(max函数的含义)2025-05-01 23:27:04
  • yml文件怎么执行(yml文件格式)2025-05-01 23:27:04
  • 安卓软件后缀名有哪些格式?(安卓应用软件的后缀名)2025-05-01 23:27:04
  • 支付方式图片表情包(支付方式有哪些图标)2025-05-01 23:27:04
  • 支付方式图片大全(支付方式内涵图)2025-05-01 23:27:04
  • 正文中一级【Word多级标题完整设置】设置各级标题样式&将多级列表链接到各级标题样式中二级【Word多级标题完整设置】设置各级标题样式&将多级列表链接到各级标题样式中三级【Word多级标题完整设置】设置各级标题样式&将多级列表链接到各级标题样式中格式(正文中一级【Word多级标题完整设置】设置各级标题样式&将多级列表链接到各级标题样式中二级【Word多级标题完整设置】设置各级标2025-05-01 23:27:04
  • 全屏图片