Che cosa è più semplice Query SQL per trovare il secondo valore più grande?

StackOverflow https://stackoverflow.com/questions/32100

  •  09-06-2019
  •  | 
  •  

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.

È stato utile?

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

:

enter image description here

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top