Извините за явно плохой запрос в теме, но он точно описывает результат, который я ищу.
У меня есть таблица с classID int, строкой studName, классом int. Мне нужен результат, в котором перечислены все classID, studName, получившие наивысшую оценку по каждому курсу. оценку могут получить несколько учащихся, и каждый из них должен быть указан в порядке убывания сначала по идентификатору класса, а затем по имени studName.
образец вывода: | идентификатор класса | studName| |---------|---------| | 101 | Мэри | | 101 |Нейт | | 101 |Крис | | 102 |Бенджамин | | 103 |Нейт | |103 |Том | и т.д...
мое первое предположение:
SELECT classID, studName from table1 where grade = MAX(grade) group by classID, studName;
но это дает ошибку: ... еще не поддерживаемое место для UDAF 'max'
Я также попытался создать представление:
CREATE VIEW newView as select classID, MAX(grade) from table1 group by classID;
и используя его в подзапросе в операторе where:
select classID, studName from table1 where grade IN (select * from newView) group by classID, studName;
но кажется, что: "Подзапрос может содержать только 1 элемент в списке SELECT"
Я тоже безуспешно перелистал книгу «Apache Hive Essentials».
Я новичок в HiveQL, и этот не дает мне спать по ночам. Любая помощь будет принята с благодарностью.
Спасибо
Проблема с вашим SQL -
Вам нужно назвать максимальный столбец, а затем использовать его в предложении IN подзапроса.
изменить вид, как показано ниже.
CREATE VIEW newView as select classID, MAX(grade) as maxgrade from table1 group by classID;
Измените свой SQL следующим образом
select classID, studName from table1 where grade IN (select maxgrade from newView) group by classID, studName;
Решение Но этот SQL поможет вам в достижении того, что вам нужно, «найти студентов, получивших максимальную оценку по каждому предмету», путем настройки вашего SQL.
select classID, studName, grade
from table1
join (select classID mxid, MAX(grade) as maxgrade from table1 group by classID) mx -- this subquery will pick maximum grade in each class.
ON grade =mx.maxgrade and classID = mx.mxid -- This join will select only the students with maximum grade in each class.