Tengo una tabla de estudiantes (identificación, nombre, departamento, edad, puntaje). Quiero encontrar al estudiante más joven que tenga el puntaje más alto (de los estudiantes más jóvenes) de cada departamento. En SQL Server, puedo usar el siguiente SQL.Obtenga la fila superior después de la orden en Oracle Subquery
select * from student s1
where s1.id in
(select s2.id from student s2
where s2.department = s1.department order by age asc, score desc top 1).
Sin embargo, en Oracle, no se puede utilizar la cláusula ORDER BY en la sub consulta y no hay límite/superior como palabra clave. Tengo que unirme a la mesa de estudiantes consigo mismo dos veces para consultar el resultado. En Oracle, utilizo el siguiente SQL.
select s1.* from student s1,
(select s2.department, s2.age, max(s2.score) as max_score from student s2,
(select s3.department, min(s3.age) as min_age from student s3 group by s3.department) tmp1 where
s2.department = tmp1.department and s2.age = tmp1.min_age group by s2.department, s2.age) tmp2
where s1.department =tmp2.department and s1.age = tmp2.age and s1.score=tmp2.max_score
¿Alguien tiene alguna idea de simplificar el SQL anterior para Oracle?
En Oracle, * puede * utilizar la cláusula ORDER BY en una subconsulta. –
Hay una solución mucho más simple, sin funciones analíticas, vea la respuesta aceptada a mi pregunta: http://stackoverflow.com/questions/38180445/oracle-left-join-very-big-table-and-limit-the-joined -rows-to-one-with-the-large – Dany