HQL实操问题:class_id规则设置及按Student_id提取最高book_id方法
HQL问题解决方案
问题1:仅对class_id=12应用规则且保留所有class_id输出
不要使用where class_id = 12过滤数据,否则会丢失其他class_id的行,推荐使用case when条件判断实现规则仅对目标class_id生效,其他class_id保留原始值即可。
示例逻辑(以对class_id=12的学生统计附加分为例,可替换为你实际的业务规则):
select class_id, student_id, -- 仅class_id=12时应用规则,其他返回原字段值 case when class_id = 12 then score + 15 else score end as final_score, other_fields from your_table_name;
HQL也支持简化的if函数写法,逻辑等效:
select if(class_id = 12, [你的规则逻辑], 原字段名) as target_field from your_table_name;
问题2:按student_id分组取数值最大的book_id
首先提取book_id前两位字母之后的数字部分,转换为数值类型后排序,再用窗口函数取每组最大值对应行即可,避免字符串排序出现的数值判断错误问题。
示例代码:
select student_id, book_id from ( select student_id, book_id, -- 按学生分组,按book_id的数值部分倒序排序 row_number() over(partition by student_id order by cast(substr(book_id,3) as bigint) desc) as rn from your_table_name ) t where rn = 1; -- 取每个学生数值最大的book_id
说明:substr(book_id,3)表示从book_id的第3位开始截取到末尾,得到纯数字字符串,cast as bigint转换为长整型数值排序,保证数值大小判断准确。
内容的提问来源于stack exchange,提问作者Matias021
相关产品推荐
相关产品推荐

