跳到主要内容

MAX/MIN OVER 窗口函数详解

一、一句话理解

MAX() OVER()MIN() OVER() 计算每个窗口范围内的最大值和最小值,常用于查找"至今为止的最高/最低值"。

二、函数语法

MAX(列名) OVER (PARTITION BY 分组列 ORDER BY 排序列 窗口帧)
MIN(列名) OVER (PARTITION BY 分组列 ORDER BY 排序列 窗口帧)

三、真实业务场景

场景1:至今为止的最高温度

SELECT date, temperature,
MAX(temperature) OVER (ORDER BY date) AS max_so_far
FROM weather;
+------------+-------------+------------+
| date | temperature | max_so_far |
+------------+-------------+------------+
| 2025-01-01 | 5 | 5 |
| 2025-01-02 | 8 | 8 |
| 2025-01-03 | 3 | 8 | ← 虽然今天3度,但历史最高仍是8
| 2025-01-04 | 12 | 12 |
+------------+-------------+------------+

场景2:每个商品的历史最低价

SELECT product_id, price_date, price,
MIN(price) OVER (PARTITION BY product_id ORDER BY price_date) AS lowest_so_far
FROM product_prices;

场景3:找出每组薪资最高的人

SELECT dept, name, salary
FROM (
SELECT dept, name, salary,
MAX(salary) OVER (PARTITION BY dept) AS dept_max
FROM employee
) t
WHERE salary = dept_max;

四、常见坑点

坑:MAX OVER 与 GROUP BY MAX 的区别

  • MAX OVER:保留每行,每行显示窗口内的最大值
  • GROUP BY MAX:折叠为一行,只显示分组后的最大值

五、面试怎么考

  • "怎么找每个部门薪资最高的人?" → MAX OVER 子查询
  • "怎么算历史最高值?" → MAX OVER + ORDER BY

七、相关面试题

📱关注公众号

「数据仓库技术」文章同步更新,不错过每一篇干货

微信公众号二维码
💬加群交流

备注「数据仓库技术」加入社群,每日一道大厂SQL真题

交流微信二维码

你可能还想看