背景:
近来接到的需求里有很多在某个区域里去最值,然后需要所有详情字段的情况,故探索出这个新解法,传统的基本都是用窗口函数,或者group by 后用子查询去原表关联
实操:
建表:
create table tmp(
id int ,
name string ,
score int ,
sex string ,
class string
) row fromat delimited fields terminated by ','
;
;`
导入数据:
load data local inpath ‘/xxxxx’ into table tmp ;
数据如下: select * from tmp ;
实现方法:
- 方法1
窗口函数 - 方法2
使用group by class 后与原表关联取出详细字段 - 方法3
使用struct方法
构造struct ,具体sql如下,
> select class
> ,max(struct(score,id ,name,sex,class)).col1 as score
> ,max(struct(score,id ,name,sex,class)).col2 as id
> ,max(struct(score,id ,name,sex,class)).col3 as name
> ,max(struct(score,id ,name,sex,class)).col4 as sex
> from tmp group by class ;
sql跑出的结果如下:
切记:可根据自己的实际情况构造struct,具体比较时先按第一个字段进行比较,若相同则比较第二个,以此类推 ;
同理也可实现每个班最低分学生的详情
----(待更新)