跳到主要内容

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真题

交流微信二维码

你可能还想看