📜  MySQL窗口函数(1)

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

MySQL窗口函数

窗口函数 (Window Function) 是一种高级分析函数,可以在查询结果集的某个窗口(指定的一组行)上执行计算操作。窗口函数通常与分组函数一起使用,用于在各个分组中计算指定的聚合值。

1. 窗口函数的语法

在MySQL中,窗口函数的语法如下:

窗口函数名([DISTINCT] 表达式) OVER (
    [PARTITION BY 列名1, 列名2, ...]
    [ORDER BY 列名 [ASC|DESC], ...]
    [ROWS 指定范围]
)
  • 窗口函数名:要执行的窗口函数,比如SUM、AVG、ROW_NUMBER等。
  • DISTINCT:可选关键字,用于去除重复值。
  • 表达式:要计算的列或表达式。
  • PARTITION BY:可选关键字,用于将查询结果集划分为多个分组。如果不指定,则计算整个结果集。
  • ORDER BY:可选关键字,用于指定排序规则。窗口函数根据排序规则计算结果。
  • ROWS:可选关键字,用于指定计算窗口的范围。常用的范围类型有UNBOUNDED PRECEDING、UNBOUNDED FOLLOWING、CURRENT ROW等。
2. 常用的窗口函数
a. ROW_NUMBER

ROW_NUMBER()函数为结果集中的每一行分配一个唯一的整数。它不需要任何参数。

SELECT col1, col2, ROW_NUMBER() OVER (ORDER BY col1) as row_num
FROM table_name;
b. RANK

RANK()函数为结果集中的每一行分配一个排名值(整数)。如果多行具有相同的值,则排名值相同,下一个排名值会跳过相应的数量。

SELECT col1, col2, RANK() OVER (ORDER BY col1 DESC) as rank_value
FROM table_name;
c. DENSE_RANK

DENSE_RANK()函数与RANK()函数类似,不同之处在于如果有两个或多个行具有相同的值,则它们将分配相同的密集排名。

SELECT col1, col2, DENSE_RANK() OVER (ORDER BY col1) as dense_rank_value
FROM table_name;
d. SUM

SUM()函数用于计算指定列的总和。它可以与PARTITION BY子句一起使用,以在每个分组中计算总和。

SELECT col1, col2, SUM(col3) OVER (PARTITION BY col1) as sum_value
FROM table_name;
e. AVG

AVG()函数用于计算指定列的平均值。类似于SUM()函数,它也可以与PARTITION BY子句一起使用。

SELECT col1, col2, AVG(col3) OVER (PARTITION BY col1) as avg_value
FROM table_name;
3. 示例

假设有以下示例数据表 "orders":

| order_id | customer_id | order_date | total_amount | |----------|-------------|------------|--------------| | 1 | 1 | 2022-01-01 | 100.00 | | 2 | 1 | 2022-02-01 | 200.00 | | 3 | 2 | 2022-02-01 | 150.00 | | 4 | 2 | 2022-03-01 | 300.00 | | 5 | 3 | 2022-03-01 | 50.00 |

我们可以使用窗口函数来计算每个顾客的订单数和总金额。

SELECT order_id, customer_id, order_date, total_amount,
       COUNT(order_id) OVER (PARTITION BY customer_id) as order_count,
       SUM(total_amount) OVER (PARTITION BY customer_id) as total_amount_sum
FROM orders;

以上查询将返回如下结果:

| order_id | customer_id | order_date | total_amount | order_count | total_amount_sum | |----------|-------------|------------|--------------|-------------|-----------------| | 1 | 1 | 2022-01-01 | 100.00 | 2 | 300.00 | | 2 | 1 | 2022-02-01 | 200.00 | 2 | 300.00 | | 3 | 2 | 2022-02-01 | 150.00 | 2 | 450.00 | | 4 | 2 | 2022-03-01 | 300.00 | 2 | 450.00 | | 5 | 3 | 2022-03-01 | 50.00 | 1 | 50.00 |

以上示例中,我们使用COUNT()函数计算每个顾客的订单数,并使用SUM()函数计算每个顾客的订单总金额。

4. 总结

MySQL窗口函数提供了一种对结果集的子集进行聚合计算的强大工具。通过使用窗口函数,程序员可以轻松执行一些复杂的分析操作,并且可以在查询结果中添加更多有用的信息。熟练掌握窗口函数可以极大地提高查询的灵活性和效率。