iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >SQL窗口函数是什么
  • 842
分享到

SQL窗口函数是什么

2023-06-29 17:06:44 842人浏览 泡泡鱼
摘要

这篇文章主要介绍了sql窗口函数是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。窗口函数形如:表达式 OVER (PARTITioN BY 分组字段 ORDER BY 排

这篇文章主要介绍了sql窗口函数是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

    窗口函数形如:

    表达式 OVER (PARTITioN BY 分组字段 ORDER BY 排序字段)

    有两个能力:

    • 当表达式为 rank() dense_rank() row_number() 时,拥有分组排序能力。

    • 当表达式为 sum() 等聚合函数时,拥有累计聚合能力。

    无论何种能力,窗口函数都不会影响数据行数,而是将计算平摊在每一行。

    这两种能力需要区分理解。

    底表

    SQL窗口函数是什么

    以上是示例底表,共有 8 条数据,城市1、城市2 两个城市,下面各有地区1~4,每条数据都有该数据的人口数。

    分组排序

    如果按照人口排序,ORDER BY people 就行了,但如果我们想在城市内排序怎么办?

    此时就要用到窗口函数的分组排序能力:

    SQL窗口函数是什么

    SELECT *, rank() over (PARTITION BY city ORDER BY people) FROM test

    该 SQL 表示在 city 组内按照 people 进行排序。

    其实 PARTITION BY 也是可选的,如果我们忽略它:

    SELECT *, rank() over (ORDER BY people) FROM test

    也是生效的,但该语句与普通 ORDER BY 等价,因此利用窗口函数进行分组排序时,一般都会使用 PARTITION BY。

    各分组排序函数的差异

    我们将 rank() dense_rank() row_number() 的结果都打印出来:

    SELECT *, rank() over (PARTITION BY city ORDER BY people),dense_rank() over (PARTITION BY city ORDER BY people),row_number() over (PARTITION BY city ORDER BY people)FROM test

    SQL窗口函数是什么

    其实从结果就可以猜到,这三个函数在处理排序遇到相同值时,对排名统计逻辑有如下差异:

    • rank(): 值相同时排名相同,但占用排名数字。

    • dense_rank(): 值相同时排名相同,但不占用排名数字,整体排名更加紧凑。

    • row_number(): 无论值是否相同,都强制按照行号展示排名。

    上面的例子可以优化一下,因为所有窗口逻辑都是相同的,我们可以利用 WINDOW AS 提取为一个变量:

    SELECT *, rank() over wd, dense_rank() over wd, row_number() over wdFROM testWINDOW wd as (PARTITION BY city ORDER BY people)

    累计聚合

    我们之前说过,凡事使用了聚合函数,都会让查询变成聚合模式。如果不用 GROUP BY,聚合后返回行数会压缩为一行,即使用了 GROUP BY,返回的行数一般也会大大减少,因为分组聚合了。

    然而使用窗口函数的聚合却不会导致返回行数减少,那么这种聚合是怎么计算的呢?我们不如直接看下面的例子:

    SELECT *, sum(people) over (PARTITION BY city ORDER BY people)FROM test

    SQL窗口函数是什么

    可以看到,在每个 city 分组内,按照 people 排序后进行了 累加(相同的值会合并在一起),这就是 BI 工具一般说的 RUNNGIN_SUM 的实现思路,当然一般我们排序规则使用绝对不会重复的日期,所以不会遇到第一个红框中合并计算的问题。

    累计函数还有 avg() min() 等等,这些都一样可以作用于窗口函数,其逻辑可以按照下图理解:

    SQL窗口函数是什么

    你可能有疑问,直接 sum(上一行结果,下一行) 不是更方便吗?为了验证猜想,我们试试 avg() 的结果:

    SQL窗口函数是什么

    可见,如果直接利用上一行结果的缓存,那么 avg 结果必然是不准确的,所以窗口累计聚合是每行重新计算的。当然也不排除对于 sum、max、min 做额外性能优化的可能性,但 avg 只能每行重头计算。

    与 GROUP BY 组合使用

    窗口函数是可以与 GROUP BY 组合使用的,遵循的规则是,窗口范围对后面的查询结果生效,所以其实并不关心是否进行了 GROUP BY。我们看下面的例子:

    SQL窗口函数是什么

    按照地区分组后进行累加聚合,是对 GROUP BY 后的数据行粒度进行的,而不是之前的明细行。

    总结

    窗口函数在计算组内排序或累计 GVM 等场景非常有用,我们只要牢记两个知识点就行了:

    • 分组排序要结合 PARTITION BY 才有意义。

    • 累计聚合作用于查询结果行粒度,支持所有聚合函数。

    讨论地址是:精读《SQL 窗口函数》· Issue #405 · ascoders/weekly

    感谢你能够认真阅读完这篇文章,希望小编分享的“SQL窗口函数是什么”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网精选频道,更多相关知识等着你来学习!

    --结束END--

    本文标题: SQL窗口函数是什么

    本文链接: https://www.lsjlt.com/news/325907.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • 什么是SQL窗口函数
      本篇内容主要讲解“什么是SQL窗口函数”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“什么是SQL窗口函数”吧!窗口函数(Window Function) 是 SQL2003 标准中定义的一项新特...
      99+
      2023-06-15
    • SQL窗口函数是什么
      这篇文章主要介绍了SQL窗口函数是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。窗口函数形如:表达式 OVER (PARTITION BY 分组字段 ORDER BY 排...
      99+
      2023-06-29
    • Spark SQL中的窗口函数是什么
      在Spark SQL中,窗口函数是一种特殊的函数,可以用来在特定的窗口或分区中计算结果。窗口函数通常用于处理类似排名、聚合、排序等需...
      99+
      2024-04-09
      Spark
    • SQL窗口函数之排名窗口函数怎么使用
      这篇文章主要介绍“SQL窗口函数之排名窗口函数怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SQL窗口函数之排名窗口函数怎么使用”文章能帮助大家解决问题。取...
      99+
      2024-04-02
    • SQL窗口函数之排名窗口函数的使用
      目录案例分析案例使用的示例表1.环比分析2.同比分析3.复合增长率4.不同产品最高和最低销售额示例表和脚本关于窗口函数的基础,请看文章SQL窗口函数 取值窗口函数可以用于返回窗口内指...
      99+
      2024-04-02
    • SQL窗口函数之取值窗口函数的使用
      目录案例分析1.环比分析2.同比分析3.复合增长率4.不同产品最高和最低销售额示例表和脚本关于窗口函数的基础,请看文章SQL窗口函数 取值窗口函数可以用于返回窗口内指定位置的数据行。...
      99+
      2024-04-02
    • SQL中的开窗函数是什么
      本篇内容主要讲解“SQL中的开窗函数是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SQL中的开窗函数是什么”吧!OVER的定义OVER用于为行定义一个窗口...
      99+
      2024-04-02
    • SQL窗口函数怎么使用
      本文小编为大家详细介绍“SQL窗口函数怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“SQL窗口函数怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。什么是窗口函数S...
      99+
      2024-04-02
    • MySQL8.0中的窗口函数是什么
      这篇文章给大家分享的是有关MySQL8.0中的窗口函数是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在以前的MySQL版本中是没有窗口函数的,直到MySQL8.0才引入了窗口函数。窗口函数是对查询中的每一条...
      99+
      2023-06-29
    • 与SQL窗口函数相同
      窗口函数的目的是以声明的方式将业务报告需求转换为SQL,从而使查询性能和开发人员/业务分析师的效率得到显着提高。 我看到现实世界的报告和仪表板在使用窗口功能后从几小时到几分钟,几分钟到几秒钟。 ...
      99+
      2024-04-02
    • SQL窗口函数之聚合窗口函数的使用(count,max,min,sum)
      目录案例分析1.移动平均值2.累计求和(ROW)3.累计求和(RANGE)示例表和脚本关于窗口函数的基础,请看文章SQL窗口函数 许多常见的聚合函数也可以作为窗口函数使用,包括AVG...
      99+
      2024-04-02
    • SQL窗口函数的使用方法
      目录什么是窗口函数窗口函数组成部分1.创建数据分区2.分区内的排序3.指定窗口大小窗口函数分类1.聚合窗口函数2.排名窗口函数3.取值窗口函数什么是窗口函数 SQL窗口函数为在线分析...
      99+
      2024-04-02
    • oracle窗口函数的使用方法是什么
      在Oracle数据库中,窗口函数是一种用于执行聚合、排序、排名等操作的特殊函数。窗口函数不会合并行,而是在查询结果的每一行上执行计算...
      99+
      2024-04-09
      oracle
    • oracle窗口函数的执行流程是什么
      Oracle窗口函数的执行流程大致如下: 首先,确定窗口函数所应用的数据集,即确定数据集的排序顺序和分区方式。 接着,对数据...
      99+
      2024-04-09
      oracle
    • sql 窗口函数ROW_NUMBER() 分组/排序/计数
      ROW_NUMBER() 窗口函数 / 分析函数 MySQL中,row_number() 函数 用来分区的,使用它 为返回的结果集中的每一行 生成一个序列号(为行分配序号),第一个数字以1开头。 主要用来计数的,也便于用此函数针对全部字段进...
      99+
      2023-08-20
      sql 数据库 mysql
    • 带你快速了解SQL窗口函数
      目录底表分组排序各分组排序函数的差异累计聚合与 GROUP BY 组合使用总结窗口函数形如: 表达式 OVER (PARTITION BY 分组字段 ORDER BY 排序字段) 有...
      99+
      2024-04-02
    • 如何快速了解SQL窗口函数
      这篇文章主要介绍“如何快速了解SQL窗口函数”,在日常操作中,相信很多人在如何快速了解SQL窗口函数问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何快速了解SQL窗口函数”...
      99+
      2024-04-02
    • Mysql 窗口函数
      一, MySQl 8.0 窗口函数 窗口函数适用场景: 对分组统计结果中的每一条记录进行计算的场景下, 使用窗口函数更好, 注意, 是每一条!! 因为MySQL的普通聚合函数的结果(如 group...
      99+
      2023-09-17
      scala spark java
    • MYSQL窗口函数(Rows & Range)——滑动窗口函数用法
      语法介绍 窗口函数语法: over (partition by order by rows/range子句 ) 可以放以下两种函数: 1) 专用窗口函数,包括后面要讲到的rank, den...
      99+
      2023-09-03
      mysql 数据库
    • SQL中常用的窗口函数(排序函数)-row_number/rank/dense_rank/ntile
      总结四个函数的特点: row_number():连续不重复;1234567 rank() :重复不连续;1222567 dense_rank():重复且连续;1222345 ntile():平均分组;...
      99+
      2023-09-05
      mysql 数据库 大数据
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作