Wpis z mikrobloga

Jest tabela employees, gdzie są pracownicy z różnych departamentów i ich zarobki. Jak wskazać departament w którym średnia zarobków jest najwyższa, i jednocześnie podać jego departmentid? Można to zrobić prościej (albo inaczej) niż to co niżej?

select department_id, avg(salary)
from employees
having avg(salary) = (select max(avg(salary))
from employees
group by department_id)
group by department_id;

#oracle #sql
  • 13
@Rajtuz nie, jest coś takiego jak tabelka tymczasowa na której w trakcie jednego query możesz pracować. Czyli powyciągać sobie do niej dane, manipulować nimi a później połączyć do jakiegoś selecta które Ci pasuje :) przydatna rzecz mało doceniana
@Rajtuz łatwiej bedzie zrobić tak jak napisał cohontes w tym przypadku, nie ma do robic trudniej.
mimo wszystko w ramach nauki / ciekawostki dobrze poznać tymczasowe tabelki
sam w robo duzo uzywam i baaaarrrdddzzzoooo ulatwiaja mi robote (baza w okolicy 900+ tabel)
@Rajtuz: Twoja oryginalna metoda ma ta przewage na rozwiazaniem @cohontes, ze w przypadku gdy dwa lub wiecej departamentow beda miec ta sama srednia, to zwroci wszystkie wiersze a nie tylko (losowy) pierwszy.

Gdybym mial to sam napisac, to zrobilbym to za pomoca CTE (czyli tej tymczasowej tabeli) oraz DENSERANK() lub RANK():

WITH ranking AS (
SELECT
department
id,
AVG(salary) AS avgsalary,
DENSE
RANK() OVER (ORDER BY AVG(salary) DESC)
  • 0
@ch1nczyk: O, dzięki, tego sposobu nie znałem ( ʖ̯)

Racja z tym zwracaniem tylko jednego wiersza w przypadku więcej niż 1 takiej samej średniej. Trzeba by było wtedy dać FETCH FIRST 1 ROW WITH TIES
@Rajtuz: Tak, to tez by zadzialalo. W przypadku duzych tabel, trzeba by juz zrobic porownanie performance obydwu rozwiazan i zobaczyc ktore jest szybsze.
Nie kazdy silnik SQL natomiast obsluguje WITH TIES - Microsoft SQL go ma, MySQL natomiast juz nie.

W ogole na nowszych silnikach mozna to zrobic jeszcze bardziej elegancko (bez CTE) - np. w BigQuery albo Snowflake - uzywajac polecenia QUALIFY, ktora filtruje funkcje okienkowe:

SELECT
department_id,
AVG(salary) AS