max_by:按最大值取对应值
速查结论
max_by(x, y) 是 Spark SQL 中用于返回与 y 最大值相关联的 x 值的聚合函数。例如,可以一次性查出"销售额最高的那个产品",无需子查询或窗口函数。
语法
max_by(x, y)
参数说明
| 参数 | 说明 |
|---|---|
x | 待返回的值(任意类型) |
y | 用于比较的值(必须可排序) |
返回值:y 取最大值时对应的 x 值。如果有多行 y 并列最大,返回其中某一行的 x(非确定性)。
Since: 3.0.0
示例
基础用法
-- 返回 b 最大时对应的 a 值
SELECT max_by(x, y) FROM VALUES ('a', 10), ('b', 50), ('c', 20) AS tab(x, y);
-- 结果: b(因为 b 的 y=50 最大)
实际业务场景
-- 每个部门销售额最高的员工
SELECT
dept_id,
max_by(employee_name, sales_amount) AS top_sales_employee
FROM sales
GROUP BY dept_id;
-- 每个产品最新的库存记录
SELECT
product_id,
max_by(stock_quantity, update_date) AS latest_stock
FROM inventory
GROUP BY product_id;
max_by vs min_by vs 子查询 对比
| 方法 | 写法复杂度 | 性能 | 适用场景 |
|---|---|---|---|
max_by(x, y) | 极简 | 高 | 取最大值对应的关联值 |
min_by(x, y) | 极简 | 高 | 取最小值对应的关联值 |
| 子查询 / ROW_NUMBER | 复杂 | 中 | 需要复杂排序逻辑 |
-- max_by: 一行搞定
SELECT dept, max_by(name, salary) FROM t GROUP BY dept;
-- 等价子查询写法(冗长得多)
SELECT dept, name FROM (
SELECT dept, name,
ROW_NUMBER() OVER (PARTITION BY dept ORDER BY salary DESC) AS rn
FROM t
) WHERE rn = 1;
常见报错与避坑指南
并列最大值的不确定性
当多行的 y 值并列最大时,max_by 返回其中任意一行的 x 值,结果是非确定性的。
-- a='x'和a='z'的y值都是100,结果可能是'x'或'z'
SELECT max_by(x, y) FROM VALUES ('x', 100), ('y', 50), ('z', 100) AS tab(x, y);
-- 结果: 'x' 或 'z'(不确定)
y 类型必须可排序
y 必须是可排序的类型(数值、字符串、日期等),不支持 Map 等复杂类型。
📱关注公众号
「数据仓库技术」文章同步更新,不错过每一篇干货

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