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)?
Например, вход
- при использовании курсора для взаимодействия по набору результатов, все результаты будут загружены в память
- Единая дата SQL в Oracle SQL и SQL Server
- Лучший способ обеспечить участие в таблице
- MySQL, MSSql, Oracle: когда использовать какой?
- Oracle и SQL Server выбирают (+) эквивалент
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 OUTPUT INSERTED. *?
- Как загрузить данные с сервера oracle и sql в HAWQ с помощью Spring XD
- выберите TOP N строк из таблицы
- client.pk_name присоединение транзакций.fk_name vs. customer.pk_id присоединение транзакций.fk_id
- Связаны ли параметры привязки SQL с производительностью?
- Данные от Oracle на сервере MS SQL
- Не удалось загрузить файл или сборку в c #
- Не удалось подключиться к транзакции
В 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