[SQL挖掘机] - 窗口函数 - 计算移动平均

这篇具有很好参考价值的文章主要介绍了[SQL挖掘机] - 窗口函数 - 计算移动平均。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

介绍:

在窗口函数使用时,计算的是累积到当前行的所有的数据的相关操作。 实际上,还可以指定更加详细的汇总范围。该汇总范围称为 框架 (frame)。
其实这里也可以理解成一个窗口, 这个窗口是我们可以进行设置的.

之前我们介绍的窗口函数是根据partition by进行分组, 然后根据order by进行排序, 最后根据两者的一个结果输出对应的窗口函数的对应结果, 比如求和, 排序等. 也就是说, 目前的窗口就是该分组内从该组最开始的数据到计算的当前行的数据.

用法:

接下来, 就介绍这个窗口该如何进行设置:

<窗口函数> over (order by <排序用列名> rows n preceding )  
                 
<窗口函数> over (order by <排序用列名> rows between n preceding and n following)

其中,

  • preceding: 当前行以及之前 xxx 行, 多少行由前面的n指定;
  • following: 当前行以及之后 xxx 行, 多少行由前面的n指定;

也介绍一些其他格式, 在窗口函数中,主要有以下几种形式的rows子句:

  • “rows unbounded preceding”: 这表示窗口范围从无限制的开始,一直延伸到当前行。换句话说,它会考虑当前行及其之前的所有行。
  • “rows n preceding”: 这表示窗口范围从当前行的前n行开始,一直延伸到当前行。这样的语法会包括当前行在内,并考虑当前行之前的n行。
  • “rows between unbounded preceding and current row”: 这表示窗口范围从无限制的开始,一直延伸到当前行。这样的语法也会包括当前行在内。
  • “rows between n preceding and current row”: 这表示窗口范围从当前行的前n行开始,一直延伸到当前行。这样的语法会包括当前行在内,并考虑当前行之前的n行。
  • “rows between current row and unbounded following”: 这表示窗口范围从当前行开始,一直延伸到无限制的结束。这样的语法会包括当前行在内,并考虑当前行之后的所有行。

注意,上述仅列举了一些常见的rows子句形式,实际上你可以根据具体需求来组合和使用不同的rows子句,以定义窗口函数的行范围。

对于"following",它通常与"preceding"结合使用来定义窗口函数的行范围。

  • “rows n following”: 这表示窗口范围从当前行的后n行开始,一直延伸到当前行。这样的语法会包括当前行在内,并考虑当前行之后的n行。
  • “rows between current row and n following”: 这表示窗口范围从当前行开始,一直延伸到当前行的后n行。这样的语法会包括当前行在内,并考虑当前行之后的n行。
  • “rows between unbounded preceding and n following”: 这表示窗口范围从无限制的开始,一直延伸到当前行的后n行。这样的语法会考虑当前行及其之前的所有行,并且还包括当前行之后的n行。

需要注意的是,在使用"following"时,窗口函数将根据当前行为基准,在当前行的前/后指定的行数范围内进行计算。如果没有明确指定"preceding"或"following",默认情况下会假定为"preceding"。

拓展:

这里可能有些同学会有些疑问, 同时我个人也有一些疑问:
"rows between n preceding and current row" 和 "rows n preceding" 的区别是?

“rows between n preceding and current row” 和 “rows n preceding” 在使用窗口函数中有一些区别。

“rows between n preceding and current row” 表示窗口范围从当前行的前n行开始,一直延伸到当前行。这样的语法会包括当前行在内,并考虑当前行之前的n行。
举个例子,如果有一个结果集包含了10行数据,而你使用的窗口函数语法是"rows between 2 preceding and current row",那么对于第5行,窗口函数将计算从第3行到第5行的数据。

另一方面,“rows n preceding” 表示窗口范围从当前行的前n行开始,一直延伸到当前行。这样的语法也会包括当前行在内,并考虑当前行之前的n行。

区别在于"rows between n preceding and current row" 是窗口函数的一部分,用于定义窗口的起点和终点,使我们可以在范围内进行计算。而"rows n preceding" 则表示只计算当前行之前的n行,没有定义在窗口内的其他行。

简而言之,“rows between n preceding and current row” 定义了一个窗口范围,包括当前行及其之前的n行。而"rows n preceding" 只表示计算当前行之前的n行数据,没有定义窗口范围。

这样两者的优缺点是?

优点:
“rows between n preceding and current row”:
具备更灵活的窗口范围定义能力,可以根据实际需求定义窗口的起点和终点。
适用于需要在当前行及其之前的一定范围内进行复杂计算或分析的场景。
“rows n preceding”:
简洁明了,只计算当前行之前的固定行数,不需要定义窗口范围。
在只需要简单地获取当前行之前某个固定行数的数据时,使用较为方便。

缺点:
“rows between n preceding and current row”:
尽管提供了灵活性,但语法上相对复杂一些,需要指定起点和终点,可能需要更长的语句来表达窗口范围。
“rows n preceding”:
无法定义窗口范围,只能计算固定行数的数据,不适用于需要更复杂的窗口计算场景。
不支持动态调整窗口大小,只能固定在当前行之前的特定行数。

总体而言,选择使用哪种形式取决于具体的需求和计算场景。如果需要更精细的窗口范围定义和复杂的计算,建议使用"rows between n preceding and current row"。如果仅需要获取当前行之前固定行数的数据,可以选择"rows n preceding"。

但是实现的效果应该是一样的吧?

是的,从计算结果的角度来看,“rows between n preceding and current row” 和 “rows n preceding” 在大多数情况下会得到相同的结果。两者都可以用于限定窗口函数计算的行范围,并获取相同的数据。

然而,这两种语法的主要区别在于语义和灵活性。“rows between n preceding and current row” 提供了更明确和灵活的方式来定义窗口范围,使得代码更加易读和可维护。它允许我们更准确地控制窗口的起点和终点。而 “rows n preceding” 则是一种简化的形式,只能计算固定行数的数据,并且无法指定窗口的终点。

因此,虽然实现的效果可能是相同的,但选择使用适当的语法形式可以提高代码的可读性和可维护性。根据具体的需求和场景选择合适的语法形式是很重要的。文章来源地址https://www.toymoban.com/news/detail-622144.html

到了这里,关于[SQL挖掘机] - 窗口函数 - 计算移动平均的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • [SQL挖掘机] - 存储过程

    当你在sql中需要多次执行相同的一组sql语句时,存储过程是一个非常有用的工具。它是一段预先定义好的sql代码块,可以被命名并保存在数据库中,以便重复使用。 存储过程可以包含多个sql语句、逻辑流程、条件判断和循环等,可以完成复杂的数据库操作。通俗地说,存储过

    2024年02月14日
    浏览(35)
  • [SQL挖掘机] - 基本书写规则

    SQL 的基本书写规则主要包括以下几个方面: 的使用:SQL 使用一些来表示特定的操作或语义,如 SELECT、FROM、WHERE、INSERT、UPDATE、DELETE 等。这些通常需要使用大写字母书写,尽管 SQL 语言对大小写不敏感,但为了代码的可读性,通常将全部大写。 语

    2024年02月16日
    浏览(37)
  • [SQL挖掘机] - 子查询介绍

    子查询(Subquery),也被称为嵌套查询或内部查询,是指在一个查询语句中嵌套使用的查询。它是将一个查询语句作为另一个查询语句的一部分来构建更复杂的查询逻辑。 子查询通常出现在主查询的条件、选择列表或 FROM 子句中,并且可以根据需要嵌套多个层级。子查询根据

    2024年02月16日
    浏览(41)
  • [SQL挖掘机] - SELECT语句

    当我们处理数据库时, 经常需要从表中获取特定的数据. 为了实现这个目的, 我们使用一种称为\\\"select\\\"的语句. 简单来说, select语句就像一个过滤器或者选择器, 帮助我们选择 (select) 想要的数据. 通过编写select语句并执行查询操作, 我们可以按照我们的需求从数据库中提取特定的数

    2024年02月15日
    浏览(52)
  • [SQL挖掘机] - 视图相关操作

    以上语句创建了一个名为view_name的视图,它基于table_name表格,并选择了列column1、column2等作为结果集。可以使用where子句来指定条件。 注意: 视图的列名是在视图名称之后的列表中定义的。 需要注意的是视图名在数据库中需要是唯一的,不能与其他视图和表重名。 视图不仅可

    2024年02月15日
    浏览(44)
  • [SQL挖掘机] - 多表连接

    在 SQL 中,多表连接是指将多个表根据某些条件进行联接,以获取相关联的数据。这允许我们跨多个表进行查询,并且根据表之间的关系获取所需的结果。 当在多个表中存储相关数据时,使用多表连接可以将这些表组合起来以获取更全面的结果。在MySQL中,多表连接允许我们

    2024年02月15日
    浏览(42)
  • [SQL挖掘机] - HAVING语句

    经过对分组函数 group by 的介绍, 往往少不了 having , 所以这篇文章主要介绍 having 语句. group by 分组函数可以查看如下链接; https://tongjier.blog.csdn.net/article/details/131885281 having 是用于在 group by 查询中对分组结果进行过滤的子句。它允许我们在分组之后,根据聚合函数的结果来筛选

    2024年02月15日
    浏览(38)
  • [SQL挖掘机] - 查询注意事项

    先介绍一些比较基础重点的事项: 星号(*)代表全部列的意思. SQL 中可以随意使用换行符, 不影响语句执行(但不可插入空行). 设定汉语别名时需要使用双引号(\\\")括起来. 在 select 语句中使用 distinct 可以删除重复行. 注释是 SQL 语句中用来标识说明或者注意事项的部分. 分为

    2024年02月16日
    浏览(45)
  • [SQL挖掘机] - 比较运算符

    在 sql 中,比较运算符用于比较表达式或值之间的关系,并生成逻辑真(true)或逻辑假(false)的结果。比较运算符在 sql 查询中扮演着重要的角色,具有以下作用和地位: 条件筛选:比较运算符常用于 where 子句中的条件表达式,用于筛选出满足特定条件的数据行。通过使用

    2024年02月16日
    浏览(44)
  • [SQL挖掘机] - 删除数据库

    使用 SQL 中的 drop database 命令。它会删除指定的数据库及其所有相关的表、视图、索引等对象。 下面是 drop database 命令的基本语法: 其中, database_name 是要删除的数据库的名称。 请注意,执行 drop database 命令将永久删除数据库及其中的所有数据,因此在执行之前请确保你确

    2024年02月16日
    浏览(51)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包