У меня есть ученик таблицы (id, имя, отдел, возраст, оценка). Я хочу найти младшего студента, у которого самый высокий (среди младших учеников) балл каждого отдела. В SQL Server я могу использовать следующий SQL.Получите верхнюю строку после заказа в 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).
Однако в Oracle, вы не можете использовать порядок пунктом в подзапрос и нет предела/сверху, как ключевое слово. Я должен присоединиться к таблице учеников два раза, чтобы запросить результат. В oracle я использую следующий 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
У кого-нибудь есть идея упростить вышеуказанный SQL для оракула.
В Oracle, вы можете * * использовать порядок пунктом в подзапроса. –
Решение гораздо проще, без аналитических функций, см. Принятый ответ на мой вопрос: http://stackoverflow.com/questions/38180445/oracle-left-join-very-big-table-and-limit-the-joined -rows-to-one-with-the-large – Dany