SQL 查找平均分最高的工人姓名

SQL find name of worker with maximum average score

我正在尝试显示平均分最高的工人的姓名。 我的第一个 table 是工人 table 并存储 worker_id 和 worker_name。第二个 table 是测试 table 并存储参加测试的 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);

但是,这只是 returns 最高平均分的 VALUE,而不是获得该平均分的工人的姓名。如果我将 worker_name 添加到第一个 select 语句并在底部添加一个 worker_name 组,那么所有工人都会返回他们的平均值!

一种选择是使用 CTE,然后使用 max window 函数对其进行查询。

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
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
;

所以添加 worker_name,按 Max avg 降序排列。然后将结果限制为 1。

你很接近。这个想法是 select 平均匹配在单独查询中找到的最大值的工人。这是一个例子:

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