我正在尝试显示平均分数最大的工人的名字。 我的第一个表是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
组,则返回所有工作人员的平均值!
答案 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.