Qual è la query SQL più semplice per trovare il secondo valore intero più grande in una colonna specifica?
Forse ci sono valori duplicati nella colonna.
Qual è la query SQL più semplice per trovare il secondo valore intero più grande in una colonna specifica?
Forse ci sono valori duplicati nella colonna.
Risposte:
SELECT MAX( col )
FROM table
WHERE col < ( 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 è raggruppata.
Questo perché l'operazione di ordinamento è relativamente lenta rispetto alla scansione della tabella o dell'indice max
utilizzata dall'aggregazione.
In alternativa, in Microsoft SQL 2005 e versioni successive è possibile utilizzare la ROW_NUMBER()
funzione:
select col
from (
select ROW_NUMBER() over (order by col asc) as 'rowNum', col
from [table] ) withRowNum
where rowNum = 2
Vedo qui sia alcune soluzioni specifiche di SQL Server sia alcune soluzioni specifiche di MySQL, quindi potresti voler chiarire quale database ti serve. Tuttavia, se dovessi indovinare, direi SQL Server poiché questo è banale in MySQL.
Vedo anche alcune soluzioni che non funzioneranno perché non tengono conto della possibilità di duplicati, quindi fai attenzione a quali accetti. Infine, ne vedo alcuni che funzioneranno ma che eseguiranno due scansioni complete della tabella. Vuoi assicurarti che la 2a scansione stia guardando 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
Aggiornare:
SQL Server 2012 ora supporta una sintassi OFFSET / FETCH molto più chiara (e standard ):
SELECT TOP 2 [column]
FROM [Table]
GROUP BY [column]
ORDER BY [column] DESC
OFFSET 1 ROWS
FETCH NEXT 1 ROWS ONLY;
n
. Questo è quello che prova.
TOP
e OFFSET
nella stessa query.
Suppongo che tu possa fare qualcosa del tipo:
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 server del database. Suggerimento: SQL Server non ha LIMIT.
OFFSET 2
Il modo più semplice sarebbe quello di ottenere il secondo valore da questo set di risultati nell'applicazione:
SELECT DISTINCT value FROM Table ORDER BY value DESC LIMIT 2
Ma se devi selezionare il secondo valore usando SQL, che ne dici di:
SELECT MIN(value) FROM (SELECT DISTINCT value FROM Table ORDER BY value DESC LIMIT 2) AS t
LIMIT
è la sintassi di MySql, la domanda non specifica una versione di SQL.
puoi trovare il secondo valore più grande della colonna usando la seguente query
SELECT *
FROM TableName a
WHERE
2 = (SELECT count(DISTINCT(b.ColumnName))
FROM TableName b WHERE
a.ColumnName <= b.ColumnName);
puoi trovare maggiori dettagli al seguente link
http://www.abhishekbpatel.com/2012/12/how-to-get-nth-maximum-and-minimun.html
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
Non sono necessarie query secondarie ... salta una riga e seleziona le seconde righe dopo l'ordine in ordine decrescente
SELECT MAX(Salary) FROM Employee WHERE Salary NOT IN (SELECT MAX(Salary) FROM Employee )
Questa query restituirà lo stipendio massimo, dal risultato, che non contiene lo stipendio massimo dalla tabella generale.
Questo è un codice molto semplice, puoi provare questo: -
es: nome tabella = test
salary
1000
1500
1450
7500
Codice MSSQL 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 seconda riga della tabella e "recupera solo le 1 righe successive" è per mostrare solo quella 1 riga. se non usi "recupera solo 1 riga successiva", mostra tutte le righe della seconda riga.
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 qualsiasi riga .....
Tom, credi che questo fallirà quando c'è più di un valore restituito nella select max([COLUMN_NAME]) from [TABLE_NAME]
sezione. cioè dove ci sono più di 2 valori nel set di dati.
Una leggera modifica alla tua query funzionerà -
select max([COLUMN_NAME]) from [TABLE_NAME] where [COLUMN_NAME] **IN**
( select max([COLUMN_NAME]) from [TABLE_NAME] )
SELECT
*
FROM
table
WHERE
column < (SELECT max(columnq) FROM table)
ORDER BY
column DESC LIMIT 1
È il modo più esotico:
SELECT
Column name
FROM
Table name
ORDER BY
Column name DESC
LIMIT 1,1
Come hai menzionato valori duplicati. In tal caso, è possibile utilizzare DISTINCT e GROUP BY per scoprire il secondo valore più alto
Ecco un tavolo
stipendio
:
RAGGRUPPA PER
SELECT amount FROM salary
GROUP by amount
ORDER BY amount DESC
LIMIT 1 , 1
DISTINCT
SELECT DISTINCT amount
FROM salary
ORDER BY amount DESC
LIMIT 1 , 1
Prima porzione di LIMIT = indice iniziale
Seconda porzione di LIMIT = quanti valori
select max(column_name) from table_name
where column_name not in (select max(column_name) from table_name);
non in è una condizione che esclude il valore più alto di nome_colonna.
Riferimento: intervista al programmatore
Vedere Come selezionare l'ennesima riga in una tabella del database SQL? .
Sybase SQL Anywhere supporta:
SELECT TOP 1 START AT 2 value from table ORDER BY value
select top 1 MyIntColumn from MyTable
where
MyIntColumn <> (select top 1 MyIntColumn from MyTable order by MyIntColumn desc)
order by MyIntColumn desc