文章目录
over子句介绍
over子句参考链接 https://blog.youkuaiyun.com/czr11616/article/details/101645693
1. 什么是over子句
我们可以形象的把over()子句理解成开窗子句,即打开一个窗口,窗口内包含多条记录,over()会给每一行开一个窗口。如下图,总共有5条记录,每一行代表一条记录,over()在每一条记录的基础上打开一个窗口,给r1记录打开w1窗口,窗口内只包含自己,给r2打开w2窗口,窗口内包含r1、r2,给r3打开w3窗口,窗口内包含r1、r2、r3,以此类推…
由上我们不难发现,在使用over()子句进行查询的时候, 不仅可以查询到每条记录的信息,还可以查询到这条记录对应窗口内的所有记录的聚合信息,所以我们通常结合聚合函数和over()子句一起使用。
那么over()是如何进行开窗的呢?即每条记录对应的窗口内应该包含哪些记录呢?这些都是在over()子句的括号内进行定义。
2. over子句的开窗范围
- current row代表查询的当前行
- 1 preceding代表前一行
- 1 following代表后一行
- unbounded preceding代表第一行
- unbounded following代表最后一行。
(注意这里的第一行和最后一行并不是严格的第一行和最后一行,根据具体情况而定)
3. window clause
over()子句的开窗范围可以通过window 子句(window clause)在over()的括号中定义,window clause的规范如下:
(ROWS | RANGE) BETWEEN (UNBOUNDED | [num]) PRECEDING AND ([num] PRECEDING | CURRENT ROW | (UNBOUNDED | [num]) FOLLOWING)
(ROWS | RANGE) BETWEEN CURRENT ROW AND (CURRENT ROW | (UNBOUNDED | [num]) FOLLOWING)
(ROWS | RANGE) BETWEEN [num] FOLLOWING AND (UNBOUNDED | [num]) FOLLOWING
例如 :
select *,sum(column_name) over( rows between unbounded preceding and unbounded following) from table_name
表示查询每一行的所有列值,同时给每一行打开一个从第一行到最后一行的窗口,并统计窗口内所有记录的column_name列值的和。最后给每一行输出该行的所有属性以及该行对应窗口内记录的聚合值。
4. over子句默认值
如果over()子句中什么都不写的话,默认开窗范围是:rows between unbounded preceding and unbounded following
4.1 order by
如果over()子句中接