2016-11-28 2 views
2

Я пытаюсь показать имя рабочего (-ов) с наибольшими средними знаками. Моя первая таблица - таблица рабочего стола и хранит имя worker_id и worker_name. Вторая таблица - тестовая таблица и хранит employee_id того, кто прошел тест, test_id и метки.SQL найти имя работника с максимальным средним счетом

Моя цель - напечатать имя работника, который имеет самые высокие средние оценки во всех тестах. Это то, что я до сих пор:

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

Однако это только возвращает значение максимального среднего балла, а не имя (s) работника (ов), которые имеют, что среднее значение. Если я добавлю worker_name в первый оператор select, а также добавлю группу по worker_name внизу, тогда все рабочие будут возвращены с их средними значениями!

+0

См http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to- be-a-very-simple-sql-query – Strawberry

+0

Просьба показать определения таблиц, примеры данных и ожидаемый результат. – OldProgrammer

ответ

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 
+1

работает отлично и очень просто, отлично! – LEJ

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

Так добавить worker_name, заказ на Max Avg спусков. Затем ограничьте результат до 1.

+0

Что делать, если два рабочих имеют максимальный средний показатель? – LEJ

Смежные вопросы