Hive字符串转整数处理及员工表最高Grade对应薪资查询问题
Hive中识别最高Grade并获取对应薪资的解决方案
首先得明确:你的员工表中Grade是字符串类型(比如C1、C2),直接按字符串排序会出问题(比如C10会被认为比C2小,因为字符串排序是逐字符比较的)。所以核心是把Grade中的数字部分提取出来转成整数,再判断“最高”。
下面给你两种实用的Hive SQL方案,你可以根据需求选择:
方法1:子查询关联法
先把每个Grade转成对应的整数,找到最大的那个整数,再关联原表拿到对应的Grade和薪资:
WITH grade_num AS ( SELECT Empid, EmpName, Grade, Salary, -- 提取Grade中的数字部分并转成整数 CAST(REGEXP_EXTRACT(Grade, '\\d+', 0) AS INT) AS grade_int FROM emp_table ), max_grade_info AS ( SELECT MAX(grade_int) AS max_grade_int FROM grade_num ) SELECT g.Grade, g.Salary FROM grade_num g JOIN max_grade_info m ON g.grade_int = m.max_grade_int;
说明:
REGEXP_EXTRACT(Grade, '\\d+', 0)用来从Grade字符串中提取所有连续的数字(比如从C1里提取1,C2里提取2)- 用
CAST(...) AS INT把提取到的数字字符串转成整数,这样就能正确比较大小了
方法2:窗口函数法(更简洁)
用窗口函数直接给记录按Grade对应的整数降序排名,取排名第一的记录:
WITH grade_ranked AS ( SELECT Grade, Salary, -- 按Grade对应的整数降序排名,排名1的就是最高Grade RANK() OVER(ORDER BY CAST(REGEXP_EXTRACT(Grade, '\\d+', 0) AS INT) DESC) AS rnk FROM emp_table ) SELECT Grade, Salary FROM grade_ranked WHERE rnk = 1;
说明:
- 用
RANK()的好处是,如果有多个员工属于最高Grade(比如有多个C2的员工),所有符合条件的记录都会被返回;如果你只需要一条,可以换成ROW_NUMBER()
另外要注意:如果你的Grade格式有变化(比如不是单一字母+数字),需要调整正则表达式,但从你给出的样本数据来看,\\d+完全够用。
内容的提问来源于stack exchange,提问作者DevilGod
相关产品推荐
相关产品推荐

