HAVING – GROUP BY, чтобы получить последнюю запись

У меня есть таблица под названием РЕЗУЛЬТАТЫ:

RESULTS_IDN NAME SUBJECT YEAR QUALIFIED 1 MARK ENGLISH 1989 N 3 MARK ENGLISH 1991 N 5 MARK ENGLISH 1993 Y 7 MARK ENGLISH 1995 N 2 MARK MATH 1990 N 5 MARK MATH 1993 N 6 MARK MATH 1995 Y 4 MARK SCIENCE 1991 N 9 MARK SCIENCE 1997 Y 

Мне нужно знать статус квалификации CANDIDATE для SUBJECT для последнего экзамена, который он написал, как написать запрос для этого (ORACLE / MSSQL)?

Например, вход

 NAME,SUBJECT OUTPUT NAME IDN SUBJECT YEAR Q MARK,ENGLISH OUTPUT MARK 7 ENGLISH 1995 N MARK SCIENCE OUTPUT MARK 9 SCIENCE 1997 Y MARK MATH OUTPUT MARK 6 MATH 1995 Y 

Я знаю один способ решить эту проблему.

 (SELECT NAME SUBJECT YEAR MAX(YEAR) YEAR FROM RESULTS WHERE NAME = 'MARK' AND SUBJECT ='MATH' GROUP BY NAME SUBJECT YEAR) LATEST 

Присоедините приведенную выше таблицу к IDN к той же таблице, и я могу получить результаты. Но это двойная работа. Есть ли в любом случае я могу клуб MAX (YEAR) и получить CORRESPONDING YEAR, используя HAYING CLAUSE или что-то еще? Мне нужно 2 операции над данными GROUP BY, одним последним и подтвержденным статусом Qualified.

PS: Конечно, в БД есть записи для 100 кандидатов, подобных этому.

Обновление: этот вопрос также классифицируется как проблема с наибольшей-n-на-группой в соответствии с ответом 2. Интересно знать, что это секретная проблема в БД.

В Oracle и SQL Server вы можете использовать аналитические / оконные функции RANK () или ROW_NUMBER () для достижения этого:

 select * from ( select a.* , rank() over ( partition by name, subject order by year desc ) rnk from ... a ) where rnk = 1 

RANK () вернет 1 для каждой строки, которая является самой новой для name и subject , ROW_NUMBER () вернет случайную строку.

Только в Oracle вы можете использовать KEEP для получения того же результата:

 select name, subject, max(year) as year , max(qualified) keep (dense_rank first order by year desc) as qualified from ... group by name, subject 

Это постоянно обновляемая проблема наибольшего n-на-группу :

 SELECT t1.* FROM RESULTS AS t1 LEFT JOIN RESULTS AS t2 ON t1.NAME = t2.NAME AND t1.SUBJECT = t2.SUBJECT AND t1.YEAR < t2.YEAR WHERE t2.NAME IS NULL 
  • как перемещать данные
  • В чем разница между схемой Oracle и Microsoft?
  • Обновление запроса выполняется в SQL Server, но не в Oracle
  • То же мнение, очень другое время выполнения (был: Oracle связанный сервер медленный, но только во второй раз)
  • Сравните старую и новую таблицу и покажите idifference в столбце flag
  • Как я могу написать этот код для работы в oracle?
  • В чем смысл использования ключевого слова «AS» в SQL, если сглаживание может быть выполнено без него?
  • Каков наилучший подход для внедрения RegEx в Oracle или SQL Server 2005 SQL?
  • Как загружаются данные из SQL Server в SqlDataReader?
  • Как получить метаданные первичного ключа в ADO.NET 4?
  • API схемы базы данных
  • Давайте будем гением компьютера.