美文网首页
mysql8.0窗口函数 和group by 有什么区别

mysql8.0窗口函数 和group by 有什么区别

作者: 盼旺 | 来源:发表于2024-06-22 11:26 被阅读0次

    窗口函数是一种在 SQL 中用于执行聚合计算的特殊函数,它可以在查询结果集的子集上执行计算,而不是整个结果集。窗口函数通常与 OVER 子句一起使用,用于指定要执行计算的窗口范围。
    举一个实际生产中的例子,假设我们有一个销售订单表,其中包含订单号、客户ID、订单日期和订单金额等字段。我们想要计算每个客户的订单金额排名,以便了解每个客户在销售额方面的表现。在这种情况下,我们可以使用窗口函数来计算每个客户的订单金额排名。

    SELECT 
        order_number, 
        customer_id, 
        order_date, 
        order_amount,
        RANK() OVER (PARTITION BY customer_id ORDER BY order_amount DESC) AS rank
    FROM 
        sales_orders;
    

    在上面的示例中,窗口函数 RANK() 在查询结果集的每一行上计算客户订单金额的排名,而不是对整个结果集进行分组或聚合。通过使用 PARTITION BY 子句指定客户ID作为分区键,窗口函数将根据客户ID对订单金额进行排名,而不会改变结果集的行数。这样可以方便地获取每个客户的订单金额排名,而无需执行多次查询或编写复杂的子查询。

    窗口函数和 GROUP BY 子句都用于对数据进行聚合计算,但它们之间有一些重要的区别。

    1. 范围不同:
      ○ GROUP BY 子句用于对整个结果集进行分组,并对每个组执行聚合计算。结果集中的每一行将被分配到一个组中,并且每个组将生成一个聚合结果。
      ○ 窗口函数不会改变结果集的行数,它在结果集的子集上执行计算,而不是对整个结果集进行分组。窗口函数可以在每一行上执行计算,并返回与当前行相关的聚合结果,而不需要将结果集分成多个组。
    2. 输出不同:
      ○ GROUP BY 子句生成的结果集中,每个组将生成一个聚合结果,因此结果集中的每一行都代表一个组的聚合结果。
      ○ 窗口函数生成的结果集中,每一行都可能包含窗口函数的计算结果,因此窗口函数可以为每一行生成一个聚合结果,而不需要将结果集分成多个组。
      举例来说,假设我们有一个销售订单表,我们想要计算每个客户的订单总金额以及每个客户的订单金额排名:
      ● 使用 GROUP BY 子句,我们可以对客户ID进行分组,并计算每个客户的订单总金额。
      ● 使用窗口函数,我们可以在每一行上计算订单金额排名,而不需要对结果集进行分组。
      总之,虽然窗口函数和 GROUP BY 子句都用于聚合计算,但它们的使用场景和计算范围有所不同。

    相关文章

      网友评论

          本文标题:mysql8.0窗口函数 和group by 有什么区别

          本文链接:https://www.haomeiwen.com/subject/kfgkcjtx.html