SQL 的window开窗函数简单使用

这篇具有很好参考价值的文章主要介绍了SQL 的window开窗函数简单使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景:

开窗函数不论是spark的还是clickhouse的在日常的查询中是一个很常用的功能,特别是他想要解决的问题和group by的很类似,这两种容易引起混淆,本文就简单的描述下开窗函数的简单用法

使用详解

首先窗口函数和group by是完全没有交集的,他们完全没有任何关系,group by聚合数据后会导致行数合并减少,但是窗口函数不会新增行,也不会减少行,这也就意味着对于每一行,窗口函数只是附加了新的一列数据,意识到这一点很重要

其次窗口函数的执行计划就是在每条sql的最后,仅仅只是在最终的order by之前执行,所以也就意味着他不会改变最终结果的行数,仅仅是追加新的一列数据
SQL 的window开窗函数简单使用

我们来看看具体的用法:

 window_function (expression) OVER (
   [ PARTITION BY part_list ]
   [ ORDER BY order_list ]
   [ { ROWS | RANGE } BETWEEN frame_start AND frame_end ] )

window函数主要包括以下几类:
聚合函数:AVG(), COUNT(), MIN(), MAX(), SUM()

分析函数:FIRST_VALUE(), LAST_VALUE(), LEAD(), LAG()

排序函数:RANK(), DENSE_RANK(), ROW_NUMBER()

ROWS关键字是选择当前行的前后几行,例如 ROWS BETWEEN 5 PRECEDING AND 3 FOLLOWING 表示往前 5 行到往后 3 行,一共 9 行数据,注意这只是选择行数据作为窗口函数应用的范围,比如这9行数据应用Min函数,对于每一条记录来说应用窗口函数后只会得到一个结果,比如这里的最小值,我们以获取一个每个学生最高的top2学科作为例子,假设每个学生都参与五门考试,记录学生成绩的表如下

create table student{

 stu_no  String,

course  String

 score  int

}

我们想要获取每个学生最高的两门学科的成绩,我们利用开窗函数怎么得到呢?

select stu_no,course,score from 
(select stu_no,course, score,row_number() over(PARTITION BY stu_no order by score) as row_num
from student) as a
where row_num <= 2;

或者

select stu_no,course,score from 
(select stu_no,course, score,row_number() over(PARTITION BY stu_no order by score ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as row_num
from student) as a
where row_num <= 2

上面这两个sql是等价的,都可以得到每个学生分数最高的两门课程

备注: 窗口函数和group by想要解决的问题具有相似性,不过从用法角度来看,这两者没有任何交集,窗口函数会作用于group by的最终结果之上,也就是在select 之后,在最终返回结果之前文章来源地址https://www.toymoban.com/news/detail-490029.html

到了这里,关于SQL 的window开窗函数简单使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • hive sql—开窗函数—累积求和和滑动求和

    数据集有三列数据,姓名、月份和数量: 图1 使用 sum() 函数和 over() 来实现,如下: 结果如下: 同一个name,后一个月份都是前几个月份的累加和 图2 需要稍微骚一点的操作,加上一个限制条件: 数字:可正可零可负,正往前,负向后;preceding:向前几行;following:向后几行

    2024年02月11日
    浏览(45)
  • SQL_求店铺的topN && 开窗函数数据倾斜

    某互联网大厂的一道比较有深度的面试题, 参考文章 : hive|性能优化|_Hive ROW_NUMBER TopN 性能优化 有50W个 店铺,每个顾客访客访问任何一个店铺的任何一个商品时都会产生一条访问日志, 访问日志存储的表名为Visit,访客的用户id为user_id,被访问的店铺名称为shop,数据如下:

    2024年02月15日
    浏览(46)
  • 【SQL开发实战技巧】系列(二十七):数仓报表场景☞通过对移动范围进行聚集来详解分析函数开窗原理以及如何一个SQL打印九九乘法表

    【SQL开发实战技巧】系列(一):关于SQL不得不说的那些事 【SQL开发实战技巧】系列(二):简单单表查询 【SQL开发实战技巧】系列(三):SQL排序的那些事 【SQL开发实战技巧】系列(四):从执行计划讨论UNION ALL与空字符串UNION与OR的使用注意事项 【SQL开发实战技巧】系列

    2023年04月09日
    浏览(48)
  • 开窗函数的使用详解(窗口范围ROWS与RANGE图文详解)

    函数名(参数) OVER (PARTITION BY子句 ORDER BY子句 ROWS/RANGE子句) 由三部分组成: 函数名:如sum、max、min、count、avg等聚合函数以及lead、lag行比较函数等; over: ,表示前面的函数是分析函数,不是普通的集合函数; 分组子句:over后面挂号内的内容; 分析子句又由下

    2024年02月04日
    浏览(73)
  • MySQL:开窗函数

    当查询条件需要用到复杂子查询时,聚合函数操作起来非常麻烦,因此使用开窗函数能够轻松实现。 注意:在Oracle中称为分析函数。            在MySQL中称为开窗函数,使用于MySQL8.0以上版本,sql sever、hive、Oracle等。 开窗函数:为将要被操作的行的集合定义一个窗口,它对

    2023年04月18日
    浏览(29)
  • ORACLE数据库 开窗函数

    开窗函数 2.1开窗函数的定义及语法 开窗函数(又名:分析函数,窗口函数,OLAP函数) 聚合函数:将数据按照一定的规则分组,统一分析各组的某项情况,每个分组返回一行结果 开窗函数:将数据按照一定的规则分组,统一分析各组的某项情况,每行数据返回一行结果 (

    2024年02月11日
    浏览(46)
  • 【必看】最全开窗函数讲解和实战指南

    窗口函数(Window Function)是 SQL2003 标准中定义的一项新特性,并在 SQL2011、SQL2016 中又加以完善,添加了若干拓展。 一.窗口函数有什么用? 在日常工作中,经常会遇到需要 在每组内排名 ,比如下面的业务需求: 排名问题:每个部门按业绩来排名 topN问题:找出每个部门排名

    2024年01月22日
    浏览(36)
  • MySQL---控制流函数、窗口函数(序号函数、开窗聚合函数、分布函数、前后函数、头尾函数、其他函数)

    格式 解释 案例 IF(expr,v1,v2) 如果表达式 expr 成立,返回结果 v1 ;否则,返回结果 v2 。 SELECT IF(1 0,\\\' 正确 \\\',\\\' 错误 \\\')    - 正确 IFNULL(v1,v2) 如果 v1 的值不为 NULL ,则返回 v1 ,否则返回 v2 。 SELECT IFNULL(null,\\\'Hello Word\\\') -Hello Word ISNULL(expression) 判断表达式是否为 NULL SELECT ISNULL(NUL

    2024年02月04日
    浏览(46)
  • MySQL8.0数据库开窗函数

          数据库开窗函数是一种在SQL中使用的函数,它可以用来对结果集中的数据进行分组和排序,以便更好地分析和处理数据。开窗函数与聚合函数不同,它不会将多行数据聚合成一行,而是保留每一行数据,并对其进行分组和排序。 常见的开窗函数包括ROW_NUMBER()、RANK()、

    2024年02月08日
    浏览(63)
  • 【Mysql系列】LAG与LEAD开窗函数

    💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老 导航 檀越剑指大厂系列:全面总

    2024年02月05日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包