Che cosa è più semplice Query SQL per trovare il secondo valore più grande?
Domanda
Che cosa è più semplice query SQL per trovare il secondo più grande numero intero valore in una colonna specifica?
Ci sono forse valori duplicati in colonna.
Soluzione
SELECT MAX( col )
FROM table
WHERE col < ( SELECT MAX( col )
FROM table )
Altri suggerimenti
SELECT MAX(col) FROM table WHERE col NOT IN (SELECT MAX(col) FROM table);
In T-Sql ci sono due modi:
--filter out the max
select max( col )
from [table]
where col < (
select max( col )
from [table] )
--sort top two then bottom one
select top 1 col
from (
select top 2 col
from [table]
order by col) topTwo
order by col desc
In Microsoft SQL il primo modo è due volte più veloce del secondo, anche se la colonna in questione è di tipo cluster.
Questo perché l'operazione di ordinamento è relativamente lenta rispetto alla tabella o di un indice scansione che il max
aggregazione che utilizza.
In alternativa, Microsoft SQL 2005 e, soprattutto, si può utilizzare il ROW_NUMBER()
funzione:
select col
from (
select ROW_NUMBER() over (order by col asc) as 'rowNum', col
from [table] ) withRowNum
where rowNum = 2
Io vedo sia alcune specifiche di SQL Server e alcuni MySQL soluzioni specifiche qui, così si potrebbe desiderare di chiarire il database di cui hai bisogno.Però se dovessi indovinare direi di SQL Server, dato che questo è banale in MySQL.
Vedo anche alcune soluzioni che non funzionano perché non riescono a prendere in considerazione la possibilità di duplicati, in modo da essere attenti a quelli che si accetta.Infine, vedo un paio che funziona ma che non potrà fare due scansioni complete della tabella.Si desidera assicurarsi che il 2 ° scansione solo 2 valori.
SQL Server (pre-2012):
SELECT MIN([column]) AS [column]
FROM (
SELECT TOP 2 [column]
FROM [Table]
GROUP BY [column]
ORDER BY [column] DESC
) a
MySQL:
SELECT `column`
FROM `table`
GROUP BY `column`
ORDER BY `column` DESC
LIMIT 1,1
Aggiornamento:
SQL Server 2012 supporta ora una molto più pulito (e standard) OFFSET/RECUPERO sintassi:
SELECT TOP 2 [column]
FROM [Table]
GROUP BY [column]
ORDER BY [column] DESC
OFFSET 1 ROWS
FETCH NEXT 1 ROWS ONLY;
Suppongo che si può fare qualcosa di simile:
SELECT * FROM Table ORDER BY NumericalColumn DESC LIMIT 1 OFFSET 1
o
SELECT * FROM Table ORDER BY NumericalColumn DESC LIMIT (1, 1)
a seconda del database server.Suggerimento:SQL Server non LIMITE.
potete trovare il secondo più grande valore della colonna utilizzando la seguente query
SELECT *
FROM TableName a
WHERE
2 = (SELECT count(DISTINCT(b.ColumnName))
FROM TableName b WHERE
a.ColumnName <= b.ColumnName);
potete trovare maggiori dettagli sul seguente link
http://www.abhishekbpatel.com/2012/12/how-to-get-nth-maximum-and-minimun.html
Il modo più semplice sarebbe quello di ottenere il secondo valore da questo risultato nell'applicazione:
SELECT DISTINCT value FROM Table ORDER BY value DESC LIMIT 2
Ma se si deve selezionare il secondo valore di utilizzo di SQL, che ne dite di:
SELECT MIN(value) FROM (SELECT DISTINCT value FROM Table ORDER BY value DESC LIMIT 2) AS t
Una semplice query per trovare il secondo valore più grande
SELECT `Column` FROM `Table` ORDER BY `Column` DESC LIMIT 1,1;
SELECT MAX(Salary) FROM Employee WHERE Salary NOT IN (SELECT MAX(Salary) FROM Employee )
Questa query restituirà il salario massimo, dal risultato - che non contiene il massimo di stipendio da generale della tabella.
Vecchia questione so, ma questo mi ha dato una migliore exec piano:
SELECT TOP 1 LEAD(MAX (column)) OVER (ORDER BY column desc)
FROM TABLE
GROUP BY column
select * from (select ROW_NUMBER() over (Order by Col_x desc) as Row, Col_1
from table_1)as table_new tn inner join table_1 t1
on tn.col_1 = t1.col_1
where row = 2
Spero che questo aiuto per ottenere il valore per ogni riga.....
Più semplice di tutte
select sal from salary order by sal desc limit 1 offset 1
Questo è molto semplice codice, si può provare questo :-
ex :Nome tabella = test
salary
1000
1500
1450
7500
MSSQL Codice per ottenere il 2 ° valore più grande
select salary from test order by salary desc offset 1 rows fetch next 1 rows only;
qui 'offset 1 righe' significa la 2 ° riga della tabella e 'fetch next 1 righe solo per mostrare solo 1 riga.se non uso 'scarica il prossimo 1 solo righe', mostra tutte le righe della seconda riga.
select min(sal) from emp where sal in
(select TOP 2 (sal) from emp order by sal desc)
Nota
sal è col nome
emp è il nome della tabella
Tom, credo che questo avrà esito negativo quando c'è più di un valore di ritorno in select max([COLUMN_NAME]) from [TABLE_NAME]
sezione.cioèdove ci sono più di 2 valori del set di dati.
Piccola modifica alla tua query funziona -
select max([COLUMN_NAME]) from [TABLE_NAME] where [COLUMN_NAME] **IN**
( select max([COLUMN_NAME]) from [TABLE_NAME] )
select max(COL_NAME) from TABLE_NAME where COL_NAME in
(select COL_NAME from TABLE_NAME where COL_NAME < (select max(COL_NAME) from TABLE_NAME));
subquery restituisce tutti i valori diversi da quelli dei più grandi.selezionare il valore massimo dall'elenco restituito.
select col_name
from (
select dense_rank() over (order by col_name desc) as 'rank', col_name
from table_name ) withrank
where rank = 2
SELECT
*
FROM
table
WHERE
column < (SELECT max(columnq) FROM table)
ORDER BY
column DESC LIMIT 1
È il più esiest modo:
SELECT
Column name
FROM
Table name
ORDER BY
Column name DESC
LIMIT 1,1
select age from student group by id having age<(select max(age) from student)order by age limit 1
Come hai detto i valori duplicati .In tal caso, è possibile utilizzare DISTINTI e GRUPPO per saperne di secondo più alto valore
Ecco una tabella
stipendio
:
GRUPPO
SELECT amount FROM salary
GROUP by amount
ORDER BY amount DESC
LIMIT 1 , 1
DISTINTI
SELECT DISTINCT amount
FROM salary
ORDER BY amount DESC
LIMIT 1 , 1
Prima parte di un LIMITE = indice iniziale
Seconda parte del LIMITE = quante valore
SELECT MAX(sal) FROM emp
WHERE sal NOT IN (SELECT top 3 sal FROM emp order by sal desc )
questo restituirà il terzo più alto sal di tabella emp
MSSQL
SELECT *
FROM [Users]
order by UserId desc OFFSET 1 ROW
FETCH NEXT 1 ROW ONLY;
MySQL
SELECT *
FROM Users
order by UserId desc LIMIT 1 OFFSET 1
Nessun bisogno di sub query ...saltare una riga e selezionare la seconda riga dopo l'ordine decrescente
Qualcosa di simile a questo?Non ho testato, però:
select top 1 x
from (
select top 2 distinct x
from y
order by x desc
) z
order by x
Vedere Come selezionare la n-esima riga in una tabella di database SQL?.
Sybase SQL Anywhere supporta:
SELECT TOP 1 START AT 2 value from table ORDER BY value
Utilizzo di un correlata query:
Select * from x x1 where 1 = (select count(*) from x where x1.a < a)
select * from emp e where 3>=(select count(distinct salary)
from emp where s.salary<=salary)
Questa query seleziona il numero massimo di tre stipendi.Se due emp ottenere lo stesso stipendio, questo non pregiudica la query.
select top 1 MyIntColumn from MyTable
where
MyIntColumn <> (select top 1 MyIntColumn from MyTable order by MyIntColumn desc)
order by MyIntColumn desc
Questo funziona in MS SQL:
select max([COLUMN_NAME]) from [TABLE_NAME] where [COLUMN_NAME] <
( select max([COLUMN_NAME]) from [TABLE_NAME] )
Query per trovare il 2 ° numero più alto in una riga
select Top 1 (salary) from XYZ
where Salary not in (select distinct TOP 1(salary) from XYZ order by Salary desc)
ORDER BY Salary DESC
Cambiando evidenziato Top 1
per TOP 2
, 3
o 4
u può trovare il 3°, 4 ° e 5 ° più alto, rispettivamente.