2011-11-08 28 views
10

Sto tentando di visualizzare il salario medio massimo; tuttavia, non riesco a farlo funzionare.Come trovare il numero massimo

posso ottenere un elenco degli stipendi medi per visualizzare con:

select worker_id, avg(salary) 
from workers 
group by worker_id; 

Tuttavia, quando si tenta di visualizzare un elenco del salario medio massima con:

select max (avg(salary)) 
from (select worker_id, avg(salary) 
     from workers 
     group by worker_id); 

doesn' t correre. Ottengo un errore "identificatore non valido". Come faccio a utilizzare lo stipendio medio per ciascun lavoratore per trovare la media massima per ciascun lavoratore?

Grazie.

+2

mi aspetterei una colonna chiamata WORKER_ID di essere la chiave primaria per una tabella denominata LAVORATORI. In tal caso, lo stipendio di AVG() sarebbe la media per l'intera tabella e lo stipendio di MAX (AVG()) sarebbe solo lo stipendio di AVG(). Tuttavia, ho il sospetto che sia solo un modello di dati shonky. – APC

+0

Un'altra possibilità è che la chiave per la tabella sia una combinazione di worker_id e date - in tal caso, una media ponderata per numero di giorni potrebbe essere più utile di una media aritmetica semplice. –

risposta

19

Le colonne derivanti da funzioni aggregate (ad es. Avg) di solito ottengono nomi arbitrari. Basta usare un alias per esso, e selezionate da che:

select max (avg_salary) 
from (select worker_id, avg(salary) AS avg_salary 
    from workers 
    group by worker_id); 
+0

seleziona lo stipendio medio più alto ma non indica a chi è assegnato il WorkerID. Usa questo per aggiungere anche gli ID [Maximum of average] (http://stackoverflow.com/questions/2439627/maximum-of-ages) – Takedasama

-1

Si può anche fare questo con un unico select dichiarazione (che combina sia max e avg) come questo

select max(avg(salary)) max_avg_salary 
from workers 
group by worker_id; 
0

È possibile correggere la query aggiungendo un alias colonna alla colonna all'interno della sub-query, in questo modo:

select max(avg_salary) 
from (select worker_id, avg(salary) avg_salary 
     from workers 
     group by worker_id); 

Tuttavia, se worker_id identifica univocamente reco RDS sul tavolo dei lavoratori, questo è funzionalmente equivalente a (può essere semplificata a):

select max(salary) from workers; 
1
select worker_id, avgsal 
from 
(
    select worker_id, avg(salary) as avgsal 
    from workers 
    group by worker_id 
) 
where avgsal=(select max(avgsal) 
       from (select worker_id, avg(salary) as avgsal 
        from workers group by worker_id)) 

Verrà visualizzata la media più alta insieme con l'operaio id

0
select max(a.high)Avg_highest_salary, 
     e.dept 
from (
    select avg(salary) high,dept from emp group by dept) a, 
    emp e 
where a.dept = e.dept 
group by e.dept 
order by max(a.high) desc 

Mostrerà la alto Massimo stipendio medio prima con reparto

Se si non si desidera mostrare il Stipendio con Dipartimento allora è possibile utilizzare questo

select max(avg(salary)) max_avg_salary 
from emp 
group by dept; 
0

utilizzando WITH clausola può essere fatto come

with averagesal as (
select dept_id d_id, avg(sal) avgsal from emp_details group by dept_id) 
select * from averagesal where avgsal = (select max(avgsal) from averagesal); 
-1

Come spiegato here è possibile utilizzare

SELECT worker_id, AVG(salary) 
FROM workers 
GROUP BY worker_id 
HAVING AVG(salary) = (SELECT MAX(AVG(salary)) FROM workers GROUP BY worker_id) 
0

possibile in questo in modo che la prima riga sia ordinata in ordine discendente in base alla ricerca media

selezionare top 1 worker_id, avg (stipendio) come avgsalary dai lavoratori gruppo da worker_id ordine dal disc avgsalary

Problemi correlati