📅  最后修改于: 2023-12-03 15:17:49.367000             🧑  作者: Mango
窗口函数 (Window Function) 是一种高级分析函数,可以在查询结果集的某个窗口(指定的一组行)上执行计算操作。窗口函数通常与分组函数一起使用,用于在各个分组中计算指定的聚合值。
在MySQL中,窗口函数的语法如下:
窗口函数名([DISTINCT] 表达式) OVER (
[PARTITION BY 列名1, 列名2, ...]
[ORDER BY 列名 [ASC|DESC], ...]
[ROWS 指定范围]
)
ROW_NUMBER()函数为结果集中的每一行分配一个唯一的整数。它不需要任何参数。
SELECT col1, col2, ROW_NUMBER() OVER (ORDER BY col1) as row_num
FROM table_name;
RANK()函数为结果集中的每一行分配一个排名值(整数)。如果多行具有相同的值,则排名值相同,下一个排名值会跳过相应的数量。
SELECT col1, col2, RANK() OVER (ORDER BY col1 DESC) as rank_value
FROM table_name;
DENSE_RANK()函数与RANK()函数类似,不同之处在于如果有两个或多个行具有相同的值,则它们将分配相同的密集排名。
SELECT col1, col2, DENSE_RANK() OVER (ORDER BY col1) as dense_rank_value
FROM table_name;
SUM()函数用于计算指定列的总和。它可以与PARTITION BY子句一起使用,以在每个分组中计算总和。
SELECT col1, col2, SUM(col3) OVER (PARTITION BY col1) as sum_value
FROM table_name;
AVG()函数用于计算指定列的平均值。类似于SUM()函数,它也可以与PARTITION BY子句一起使用。
SELECT col1, col2, AVG(col3) OVER (PARTITION BY col1) as avg_value
FROM table_name;
假设有以下示例数据表 "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()函数计算每个顾客的订单总金额。
MySQL窗口函数提供了一种对结果集的子集进行聚合计算的强大工具。通过使用窗口函数,程序员可以轻松执行一些复杂的分析操作,并且可以在查询结果中添加更多有用的信息。熟练掌握窗口函数可以极大地提高查询的灵活性和效率。