赞
踩
在 SQL 中,窗口函数(Window Functions)是一种特殊的函数,它允许在查询结果集的特定窗口(通常是一组行)上执行聚合、分析和计算操作,而无需聚合整个结果集。窗口函数可以用来解决许多复杂的数据分析问题,例如计算排名、累积总数、移动平均值等。窗口函数通常与 OVER 子句一起使用,该子句用于定义窗口的大小和位置。
窗口函数的一般语法结构如下:
- <窗口函数>([参数]) OVER (
- [PARTITION BY 列1, 列2, ...]
- [ORDER BY 列3 [ASC|DESC]]
- [ROWS | RANGE 关键字]
- [窗口范围或行数定义]
- )
<窗口函数>
是要执行的窗口函数,例如 SUM、AVG、ROW_NUMBER 等。PARTITION BY
子句可选,用于对结果集进行分区,将数据划分为不同的分组。ORDER BY
子句可选,用于对每个分区内的行进行排序。ROWS
或 RANGE
关键字指定窗口的类型,ROWS
表示窗口以行数为单位,RANGE
表示窗口以值范围为单位。ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING
表示窗口包括当前行及其前面的三行和后面的一行。ROW_NUMBER():为结果集中的每一行分配一个唯一的数字序号。
语法格式:
ROW_NUMBER() OVER (ORDER BY 列1 [ASC|DESC])
RANK():为结果集中的每一行分配一个排名,如果有相同的值,则会跳过相同的排名。
语法格式:
RANK() OVER (ORDER BY 列1 [ASC|DESC])
DENSE_RANK():为结果集中的每一行分配一个密集排名,如果有相同的值,则仍然连续分配排名。
语法格式:
DENSE_RANK() OVER (ORDER BY 列1 [ASC|DESC])
SUM():计算指定列的总和,可以在窗口内计算。
语法格式:
SUM(列1) OVER (PARTITION BY 列2 ORDER BY 列3 [ASC|DESC])
AVG():计算指定列的平均值,可以在窗口内计算。
语法格式:
AVG(列1) OVER (PARTITION BY 列2 ORDER BY 列3 [ASC|DESC])
LEAD():获取结果集中当前行后面的指定行数的值。
语法格式:
LEAD(列1, offset, default_value) OVER (ORDER BY 列2 [ASC|DESC])
LAG():获取结果集中当前行前面的指定行数的值。
语法格式:
LAG(列1, offset, default_value) OVER (ORDER BY 列2 [ASC|DESC])
FIRST_VALUE():获取结果集中指定列的第一个值。
语法格式:
FIRST_VALUE(列1) OVER (ORDER BY 列2 [ASC|DESC])
LAST_VALUE():获取结果集中指定列的最后一个值。
语法格式:
LAST_VALUE(列1) OVER (ORDER BY 列2 [ASC|DESC] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
COUNT():计算指定列的行数,可以在窗口内计算。
语法格式:
COUNT(列1) OVER (PARTITION BY 列2 ORDER BY 列3 [ASC|DESC])
MAX():获取指定列的最大值,可以在窗口内计算。
语法格式:
MAX(列1) OVER (PARTITION BY 列2 ORDER BY 列3 [ASC|DESC])
MIN():获取指定列的最小值,可以在窗口内计算。
语法格式:
Min(列1) OVER (PARTITION BY 列2 ORDER BY 列3 [ASC|DESC])
NTILE():将结果集分成指定数量的桶,并为每个桶分配一个编号。
语法格式:
NTILE(number_of_buckets) OVER (ORDER BY 列1 [ASC|DESC])
PERCENT_RANK():计算结果集中每行的百分比排名。
语法格式:
PERCENT_RANK() OVER (ORDER BY 列1 [ASC|DESC])
CUME_DIST():计算结果集中每行的累积分布值。
语法格式:
CUME_DIST() OVER (ORDER BY 列1 [ASC|DESC])
ROW_NUMBER():为结果集中的每一行分配一个唯一的数字序号。
语法格式:
ROW_NUMBER() OVER (ORDER BY 列1 [ASC|DESC])
CTE语法类似子查询,可以将一个select语句计算的结果当成一个新的临时表使用。
- -- 子查询,将子查询的结果当做表使用
- select empno,ename from (
- select * from emp) t1;
- -- 基本用法
- with 临时表名 as(查询语句)
- select * from 临时表名
-
- -- 多个计算结果保存
- with tb1 as(查询语句),,
- tb2 as(查询语句 select * from tb1),
- tb3 as(查询语句)
- .....
- select * from tb3 join tb2
- with tb1 as(select * from emp)
- select ename,sal from tb1;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。