📅  最后修改于: 2023-12-03 15:41:06.233000             🧑  作者: Mango
在MySQL中,窗口函数是一种在结果集中执行的函数。与聚合函数不同,它们不会将行分组为单个结果行,而是将结果应用于整个行集合。
窗口函数最常见的用途是计算分组函数的结果。例如,我们可能希望为每个部门计算平均工资或每个客户计算销售额。在这种情况下,聚合函数只能返回单个结果行,而窗口函数可以返回多行。
在MySQL中使用窗口函数需要使用OVER
关键字,并且必须指定一个ORDER BY
子句来定义分区。其中,OVER
子句通常用于定义行从属的特定分区,如:
SELECT column1, column2, SUM(column3) OVER (
PARTITION BY column4 ORDER BY column5
) AS window_sum
FROM table_name;
上述语法中,我们使用了SUM
函数对column3
求和,对于每个分区,它都有独立的结果。在这个例子中,我们按column4
分组并按column5
排序。这个排序定义将决定哪些行属于每个分区。
在MySQL中,我们可以使用大多数常见的聚合函数作为窗口函数,例如AVG
、SUM
、COUNT
、MIN
和MAX
,以及其他聚合函数。
使用窗口函数时,我们可以向其提供一个特定的子集,它可以查看特定的列值,也可以查看整个表。例如,在以下SQL查询中,我们使用SUM
函数来计算column1
的总和:
SELECT column1, SUM(column1) OVER () AS window_sum FROM table_name;
上述查询将返回以下结果:
+---------+-------------+
| column1 | window_sum |
+---------+-------------+
| 1 | 50 |
| 2 | 50 |
| 3 | 50 |
| 4 | 50 |
| 5 | 50 |
| 6 | 50 |
| 7 | 50 |
| 8 | 50 |
| 9 | 50 |
| 10 | 50 |
+---------+-------------+
在上面的结果中,我们使用SUM
函数计算了column1
的总和,并将结果存储在window_sum
列中。由于我们没有定义任何完整性约束,它会计算整个表中的值。
这里我们给出一个窗口函数的例子,展示如何在MySQL中使用窗口函数。
假设我们有一个在多家门店中出售物品的表。该表包括以下列:
store_id
:门店的唯一标识符。item_id
:售出商品的唯一标识符。sale_date
:售出商品的日期。sale_amount
:商品销售额。以如下SQL语句创建这个表格:
CREATE TABLE sales (
store_id INT,
item_id INT,
sale_date DATE,
sale_amount DECIMAL(10, 2)
);
现在,我们想要计算窗口内的平均销售额。我们可以使用以下SQL语句:
SELECT store_id,
item_id,
sale_date,
sale_amount,
AVG(sale_amount) OVER (
PARTITION BY store_id, item_id
ORDER BY sale_date
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
) AS avg_sale_amount
FROM sales;
在上述查询中,我们使用了AVG
函数作为窗口函数,并为每个store_id
和item_id
分区,按sale_date
排序。最后,我们还将过去两行(包括当前行)的数据作为窗口。
上述查询将返回以下结果(取代中间结果):
+----------+---------+------------+------------+----------------+
| store_id | item_id | sale_date | sale_amount| avg_sale_amount|
+----------+---------+------------+-----------+----------------+
| 1 | 10 | 2021-07-01 | 12.50| 12.50 |
| 1 | 10 | 2021-07-02 | 15.50| 14.00 |
| 1 | 10 | 2021-07-03 | 18.75| 15.92 |
| 1 | 10 | 2021-07-04 | 20.25| 18.17 |
| 1 | 20 | 2021-07-01 | 8.25| 8.25 |
| 1 | 20 | 2021-07-02 | 11.50| 9.88 |
| 1 | 20 | 2021-07-03 | 9.75| 9.17 |
| 1 | 20 | 2021-07-04 | 12.50| 11.25 |
+----------+---------+------------+-----------+----------------+
在上述结果中,我们使用AVG
函数计算窗口内的平均销售额,并将结果存储在avg_sale_amount
列中。我们可以看到每个store_id
和item_id
组合的平均销售额,以及销售日期。由于我们定义了一个三行窗口(包括当前行),因此头两行的平均销售额为当前行的销售金额,第三行平均销售额考虑了前两行和当前行的销售额。
窗口函数在MySQL中提供了一种快速有效的方法来计算特定窗口的聚合函数结果。使用窗口函数,开发人员能够轻松地计算分区函数的结果,并使用特定列组合来聚合行。在处理大型数据集时,窗口函数是一种非常强大的工具,值得程序员掌握。