开窗函数(Window Function)是SQL中的一种高级功能,允许你在一组相关行(一个“窗口”)上执行聚合操作,而不像传统聚合函数(如SUM(), AVG(), COUNT())那样将所有匹配行合并成单个汇总行。开窗函数在处理复杂的数据分析和报告任务时特别有用,因为它能保持原始数据行的同时进行复杂的计算。以下是开窗函数的关键特性:
基本概念: 开窗函数在查询结果集上定义一个“窗口”或“视图”,这个窗口可以包含当前行、前面的行、后面的行,甚至整个结果集的一部分。函数计算时会考虑这个窗口内的数据,但结果仍然按行返回。
主要类别:
聚合函数:如SUM(), AVG(), COUNT(), MIN(), MAX(),但它们在每个窗口内计算,而不是整个结果集。
排位函数:包括RANK(), DENSE_RANK(), ROW_NUMBER(),用于确定行在窗口中的位置。
分析函数:如LEAD(), LAG(), FIRST_VALUE(), LAST_VALUE(),用于访问同一窗口内的其他行数据。
语法结构:
function_name() OVER (
[PARTITION BY column1, column2, ...]
[ORDER BY column3, column4, ... [ASC|DESC]]
[ROWS BETWEEN start AND end]
)
PARTITION BY:将结果集分割成多个分区,每个分区单独处理。
ORDER BY:在每个分区或整个窗口内定义行的顺序。
ROWS BETWEEN:进一步定义窗口的范围,比如前几行、后几行或特定范围内的行。
mysql 如果你用的版本不支持开窗函数,可以自己实现
实例:
CREATE TABLE `ranktest` (
`id` int(11) NOT NULL,
`name` varchar(255) DEFAULT NULL,
`type2` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
SELECT
( @i := CASE WHEN @type2 = type2 THEN @i + 1 ELSE 1 END ) AS rownum,
p.*,(
@type2 := type2
)
FROM
ranktest p,(
SELECT
@i := 0
) AS a
ORDER BY
type2,
id DESC
完成了 type2 相同的作为一个 窗口进行 独立排序 。
sql 解释:
(select @i := 0 ) as a来初始化变量@i为0
@type2 := type2 将当前行的 type2 字段 赋值给 @type2变量
( @i := CASE WHEN @type2 = type2 THEN @i + 1 ELSE 1 END ) AS rownum 来判断当前行的type2值是否与前一行的type2相同,从而决定@i的值是递增还是重置为1