跳转到主要内容
模块 13 · 第 1 课(共 4)课程中的49/57~15 min
模块课程(1/4)

简介和 OVER 子句

引言和 OVER 子句

在前面的课程中,我们了解了如何使用 GROUP BY 来聚合数据。然而,GROUP BY 有一个巨大的限制:它会折叠行。如果按城市分组,则每个城市只有一行,并且会丢失各个客户的详细信息。

这就是窗口函数发挥作用的地方。它们允许您运行聚合计算(例如求和或平均值)同时保留原始行。

OVER() 子句

神奇的关键字是 OVER()。它告诉数据库聚合函数(例如 SUM、AVG、COUNT)应被视为窗口函数,在整个结果集(全局“窗口”)上计算,但在每一行上应用和返回。

SQL
SELECT
  order_id,
  total_amount,
  AVG(total_amount) OVER() AS global_average
FROM orders;

在此示例中,我们保留每个单独的订单,但每一行还有一个 global_average 列,其中包含所有订单的平均值。非常有用,例如,测量订单偏离平均值的程度!

锻炼#sql.m13.l1.e1
尝试:0加载中...

从“产品”表中选择“价格”列。添加一个名为“global_max_price”的列,其中包含通过整个表的窗口函数计算出的最高价格。

正在加载编辑器...
显示提示

将 MAX(价格) 与 OVER() 结合使用。

3 次尝试后可用的解决方案

锻炼#sql.m13.l1.e2
尝试:0加载中...

提取“id”、“price”并从“products”表中添加总体平均价格(“global_avg”)。

正在加载编辑器...
显示提示

只需添加 AVG(价格) OVER()。

3 次尝试后可用的解决方案