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
我正在尝试显示平均分最高的工人的姓名。 我的第一个 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