2013-04-11 16 views
19

Ho una tabella con dati sulle città che include il nome, la popolazione e altri campi non pertinenti alla mia domanda.Trova il valore massimo e mostra il valore corrispondente da un campo diverso nel server SQL

ID  Name Population 
1  A  45667 
2  B  123456 
3  C  3005  
4  D  13769 

Per trovare la popolazione massima è essenziale, ma ho bisogno di una tabella risultante che ha la popolazione massimo in una colonna, e il nome della città corrispondente del in un'altra colonna

Population  Name  
123456   B  

Ho guardato attraverso similar domande, ma per qualche motivo le risposte sembrano troppo complicate. C'è un modo per scrivere la query in 1 o 2 righe?

+1

Si potrebbe avere più di una città con una determinata (massima) popolazione. È accettabile un risultato a più record per te? – Pino

+0

la tabella è dati del mondo reale delle città degli Stati Uniti, quindi non ci sono duplicati. – HDunn

+5

Penso che tu non conosca la legge di Murphy :-) – Pino

risposta

30

Ci sono diversi modi che questo può essere fatto:

un filtro nella clausola WHERE:

select id, name, population 
from yourtable 
where population in (select max(population) 
        from yourtable) 

O una subquery:

select id, name, population 
from yourtable t1 
inner join 
(
    select max(population) MaxPop 
    from yourtable 
) t2 
    on t1.population = t2.maxpop; 

Oppure si può usare TOP WITH TIES. Se non ci sono vincoli, puoi rimuovere lo with ties. Ciò includerà tutte le righe che hanno lo stesso valore della popolazione:

select top 1 with ties id, name, population 
from yourtable 
order by population desc 

Dal momento che si utilizza SQL Server è inoltre possibile utilizzare le funzioni di ranking per ottenere il risultato:

select id, name, population 
from 
(
    select id, name, population, 
    row_number() over(order by population desc) rn 
    from yourtable 
) src 
where rn = 1 

Vedi SQL Fiddle with Demo di tutti.

Come nota a margine sulla funzione classifica, è possibile utilizzare dense_rank() anziché row_number(). Quindi, nel caso in cui tu abbia più di una città con la stessa popolazione, otterrai entrambi i nomi delle città. (Vedi Demo)

+0

Il primo esempio funziona, grazie. – HDunn

+3

@HDunn Sei il benvenuto, volevo mostrarti diverse versioni funzionanti. :) – Taryn

+2

"order by .... desc limit 1" è un'idea semplice e simpatica, che non mi viene in mente qualche volta :) – Dexter

Problemi correlati