SQL查找具有最大平均分数的worker名称

时间:2016-11-28 14:54:24

标签: sql oracle average greatest-n-per-group

我正在尝试显示平均分数最大的工人的名字。 我的第一个表是worker表,它存储了worker_id和worker_name。第二个表是测试表,它存储了参加测试的worker_id,test_id和标记。

我的目标是能够打印所有测试中平均分数最高的工作人员的姓名。这就是我到目前为止所做的:

    select max(avg_mark) as max_avg
    from (
        select worker_name, avg(mark) as avg_mark
        from worker join test worker.worker_id = test.worker_id
        group by worker_name
        order by avg(mark) desc);

但是,这仅返回最大平均标记的VALUE,而不返回具有该平均值的工人的名称。如果我将worker_name添加到第一个选择语句,并在底部添加一个worker_name组,则返回所有工作人员的平均值!

4 个答案:

答案 0 :(得分:3)

一种选择是使用CTE,然后使用最大窗口函数进行查询。

with cte as
(
    select worker_name, avg(mark) as avg_mark
    from worker join test worker.worker_id = test.worker_id
    group by worker_name
)
select t.*
from
(
    select worker_name, avg_mark, max(avg_mark) over (partition by worker_name) max_mark
    from cte
) t
where t.avg_mark = t.max_mark

答案 1 :(得分:3)

select      min(worker_name) keep (dense_rank last order by avg(mark))
from        worker join test worker.worker_id = test.worker_id
group by    worker_name
;

答案 2 :(得分:1)

你很亲密。我们的想法是选择平均匹配单独查询中找到的最大值的工人。这是一个例子:

select master.worker_name, mx.max_mark
from
(select worker_name, avg(mark) as avg_mark
 from worker
 inner join test on worker.worker_id = test.worker_id
 group by worker_name) master
inner join
(select max(mark) as max_mark
 from test) mx
on master.avg_mark = mx.max_mark

答案 3 :(得分:-1)

所以添加worker_name,按最大平均值降序排序。然后将结果限制为1.