📜  窗口函数mysql(1)

📅  最后修改于: 2023-12-03 15:41:06.233000             🧑  作者: Mango

窗口函数MySQL

在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中,我们可以使用大多数常见的聚合函数作为窗口函数,例如AVGSUMCOUNTMINMAX,以及其他聚合函数。

使用窗口函数时,我们可以向其提供一个特定的子集,它可以查看特定的列值,也可以查看整个表。例如,在以下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_iditem_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_iditem_id组合的平均销售额,以及销售日期。由于我们定义了一个三行窗口(包括当前行),因此头两行的平均销售额为当前行的销售金额,第三行平均销售额考虑了前两行和当前行的销售额。

结论

窗口函数在MySQL中提供了一种快速有效的方法来计算特定窗口的聚合函数结果。使用窗口函数,开发人员能够轻松地计算分区函数的结果,并使用特定列组合来聚合行。在处理大型数据集时,窗口函数是一种非常强大的工具,值得程序员掌握。