group by - inner - Encontrar la primera fila en un grupo usando Hive
inner join hive example (3)
Otra forma de usar row_number()
select * from (
select *,
row_number() over (partition by school,class,roll order by marks desc) rn
from students
) t1 where rn = 1
Si desea devolver todos los enlaces para las mejores calificaciones, use rank()
lugar de row_number()
Para una base de datos de estudiantes en el siguiente formato
Roll Number | School Name | Name | Age | Gender | Class | Subject | Marks
¿Cómo saber quién obtuvo la calificación más alta para cada clase? La consulta siguiente devuelve todo el grupo, pero estoy interesado en encontrar la primera fila del grupo.
select school,class,roll,sum(marks) as total from students group by school,class,roll order by school, class, total desc;
Tendrás que hacer un grupo más por y unirte para obtener los resultados deseados. Esto debería hacer:
select q1.*, q2.roll from
(
select school, class, max(total) as max from
(
select school,class,roll,sum(marks) as total from students group by school,class,roll order by school, class, total desc
)q3 group by school, class
)q1
LEFT OUTER JOIN
(select school,class,roll,sum(marks) as total from students group by school,class,roll order by school, class, total desc)q2
ON (q1.max = q2.total) AND (q1.school = q2.school) AND (q1.class = q2.class)
Tendremos que basarnos en la consulta que nos ha proporcionado:
La consulta dada le dará las calificaciones por clase por rollo. Para saber el total más alto alcanzado por clase, tendrá que eliminar el número de rollo de la selección y luego agrupar en esta consulta.
Ahora sabemos la escuela, la clase y el total más alto por clase por escuela. Solo tiene que averiguar el número de rollo correspondiente a este total. Para eso, se necesitará una unión.
La consulta final se verá así:
select a.school, a.class, b.roll, a.highest_marks from
(select q.school as school, q.class as class, max(q.total) as highest_marks from(select school, class, roll, sum(marks) as total from students group by school, class, roll)q group by school, class)a
join
(select school, class, roll, sum(marks) as total from students group by school, class, roll)b
on (a.school = b.school) and (a.class = b.class) and (a.highest_marks = b.total)