🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
**窗口函数与聚合函数的比较:** 聚合函数:输入为多行记录,作用于由`group by`子句聚合的组,对其作用的每一组记录输出一条结果。 窗口函数:输入为多行记录,作用于一个窗口,对其作用的窗口的每一行记录输出一条结果。 窗口:指的是由一个`over()`子句定义的多行记录。 <br/> **窗口函数的实现原理:** 在用 `group by` 处理数据分组时,每一行只能进入一个分组。窗口函数基于称为框(frame)的一组行,计算表的每一输入行的返回值,每一行可以属于一个或多个框。常见用例就是查看某些值的滚动平均值,其中每一行代表一天,那么每行属于 7 个不同的框。 ![](https://img.kancloud.cn/53/67/53671886f033ad9690acf6aa94b4b855_1097x228.png) **窗口函数基本语法:** ```sql Function(arg1, ..., argn) over([partition by <...>] [order by <...>] [window_clause]) -- Function(arg1, ..., argn) 函数,如sum求和、first_value取第一个值 -- partition by 指明分区字段,如果省略则将所有数据作为一个分区 -- order by 指明每个分区排序的字段和方式,如果省略则按照表中原有顺序排序 -- window_clause,指明相对于当前记录的计算范围,分别有向上preceding、向下following、上下边界值between,省略则默认为当前分区 -- 只有在指定order by子句后才能指定window_clause,window_clause可取的值如下 -- rows between 也叫window子句 -- n+preceding 向前n条 -- n+following 向后n条件 -- current row 当前行 -- unbounded 无边界,从最前面的点到最后面的点 -- unbounded preceding 向前无边界 -- unbounded following 向后无边界 ``` * 对于过滤窗口函数计算必须在外面一层。 按功能可将窗口函数划分为:序列,聚合,分析三类窗口函数。