Вы можете использовать аналитические функции :
WITH RankedAndAveraged AS (
SELECT
ename,
dept,
sal,
RANK() OVER (PARTITION BY dept ORDER BY sal DESC) AS rnk,
AVG(sal) OVER (PARTITION BY dept) AS "average of dept"
FROM atable
)
SELECT
ename,
dept,
sal,
"average of dept"
FROM RankedAndAveraged
WHERE rnk = 1
Это может вернуть более одного сотрудника на отдел, если все они имеют одинаковое максимальное значение sal
. Вы можете заменить RANK()
на ROW_NUMBER()
, если вам нужен только один человек на отдел (в этом случае вы также можете дополнительно расширить ORDER BY
, указав дополнительные критерии сортировки для выбора верхнего элемента, в противном случае он будет выбран случайным образом из числа с максимальной зарплатой).