做网站高亮,网站备案 前置审批文件,上海网站建设公司排行,psd数据网站介绍:
在窗口函数使用时#xff0c;计算的是累积到当前行的所有的数据的相关操作。 实际上#xff0c;还可以指定更加详细的汇总范围。该汇总范围称为 框架 (frame)。 其实这里也可以理解成一个窗口, 这个窗口是我们可以进行设置的.
之前我们介绍的窗口函数是根据partition…介绍:
在窗口函数使用时计算的是累积到当前行的所有的数据的相关操作。 实际上还可以指定更加详细的汇总范围。该汇总范围称为 框架 (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” 则是一种简化的形式只能计算固定行数的数据并且无法指定窗口的终点。
因此虽然实现的效果可能是相同的但选择使用适当的语法形式可以提高代码的可读性和可维护性。根据具体的需求和场景选择合适的语法形式是很重要的。