hiveQL 查询 select classID,来自 table1 的 studName where grade = Max(grade) group by classID,studName;

hiveQL query select classID, studName from table1 where grade = Max(grade) group by classID, studName;

很抱歉在主题中写了一个明显错误的查询,但它准确地描述了我正在寻找的结果。

我有一个 table,带有 classID int、studName string、grade int。我需要一个结果,列出在每门课程中取得最高成绩的每个 classID、studName。多个学生可以达到成绩,每个学生应按降序排列,先按 classID,然后按 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;

但似乎: “子查询只能包含 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.

帮助您实现所需的 'find students who got max grade in each subject'
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.