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
七、相关面试题
- 01. 合并日期重叠的活动 — MAX OVER 区间合并
- 01. 合并数据 — MAX OVER 分组聚合
- 更多窗口函数面试题 →
📱关注公众号
「数据仓库技术」文章同步更新,不错过每一篇干货

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