Quelle est la requête SQL la plus simple pour trouver la deuxième plus grande valeur?

Quelle est la requête SQL la plus simple pour trouver la deuxième plus grande valeur entière dans une colonne spécifique?

il y a peut-être des valeurs dupliquées dans la colonne.

137
demandé sur Mark 2008-08-28 16:39:53

30 réponses

SELECT MAX( col )
  FROM table
 WHERE col < ( SELECT MAX( col )
                 FROM table )
248
répondu Matt Rogish 2008-08-28 12:43:40
SELECT MAX(col) FROM table WHERE col NOT IN (SELECT MAX(col) FROM table);
53
répondu Vinoy 2011-09-09 21:33:33

en T-Sql il y a deux façons:

--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 

dans Microsoft SQL la première voie est deux fois plus rapide que la seconde, même si la colonne en question est regroupée.

cela est dû au fait que l'opération de tri est relativement lente par rapport au balayage de table ou d'index utilisé par l'agrégation max .

alternativement, dans Microsoft SQL 2005 et au-dessus, vous pouvez utiliser la fonction ROW_NUMBER() :

select col
from (
    select ROW_NUMBER() over (order by col asc) as 'rowNum', col
    from [table] ) withRowNum 
where rowNum = 2
29
répondu Keith 2011-04-12 10:04:49

je vois à la fois des solutions spécifiques au serveur SQL et des solutions spécifiques à MySQL ici, donc vous pourriez vouloir clarifier quelle base de données vous avez besoin. Mais si je devais deviner, je dirais SQL Server puisque C'est trivial en MySQL.

je vois aussi des solutions qui ne fonctionneront pas parce qu'elles ne tiennent pas compte de la possibilité de duplicata, alors faites attention à celles que vous acceptez. Enfin, j'en vois quelques-uns qui fonctionneront, mais qui feront deux balayages complets de la table. Vous voulez pour s'assurer que le 2e scan ne regarde que 2 valeurs.

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

mise à jour:

SQL Server 2012 supporte maintenant une syntaxe beaucoup plus propre (et standard ) OFFSET/FETCH:

SELECT TOP 2 [column] 
FROM [Table] 
GROUP BY [column] 
ORDER BY [column] DESC
OFFSET 1 ROWS
FETCH NEXT 1 ROWS ONLY;
15
répondu Joel Coehoorn 2013-04-01 23:45:06

je suppose que vous pouvez faire quelque chose comme:

SELECT * FROM Table ORDER BY NumericalColumn DESC LIMIT 1 OFFSET 1

ou

SELECT * FROM Table ORDER BY NumericalColumn DESC LIMIT (1, 1)

dépend de votre serveur de base de données. Conseil: le serveur SQL ne limite pas.

11
répondu dguaraglia 2008-08-28 12:43:25

le plus facile serait d'obtenir la deuxième valeur de ce résultat défini dans l'application:

SELECT DISTINCT value FROM Table ORDER BY value DESC LIMIT 2

mais si vous devez sélectionner la deuxième valeur en utilisant SQL, Que diriez - vous de:

SELECT MIN(value) FROM (SELECT DISTINCT value FROM Table ORDER BY value DESC LIMIT 2) AS t
6
répondu Magnar 2008-08-28 12:56:32

vous pouvez trouver la deuxième plus grande valeur de la colonne en utilisant la requête suivante

SELECT *
FROM TableName a
WHERE
  2 = (SELECT count(DISTINCT(b.ColumnName))
       FROM TableName b WHERE
       a.ColumnName <= b.ColumnName);

, vous pouvez trouver plus de détails sur le lien suivant

http://www.abhishekbpatel.com/2012/12/how-to-get-nth-maximum-and-minimun.html

5
répondu user1796141 2013-01-23 06:36:50

une requête très simple pour trouver la deuxième plus grande valeur

SELECT `Column` FROM `Table` ORDER BY `Column` DESC LIMIT 1,1;
4
répondu petcy 2014-05-29 20:16:47
SELECT MAX(Salary) FROM Employee WHERE Salary NOT IN (SELECT MAX(Salary) FROM Employee )

cette requête retournera le salaire maximum, du résultat - qui ne contient pas le salaire maximum de la table globale.

3
répondu Naresh Kumar 2016-04-26 09:44:47

vieille question je sais, mais cela m'a donné un meilleur plan exec:

 SELECT TOP 1 LEAD(MAX (column)) OVER (ORDER BY column desc)
 FROM TABLE 
 GROUP BY column
3
répondu dier 2016-07-29 18:52:25

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

espère que cette aide pour obtenir la valeur pour n'importe quelle rangée.....

2
répondu Rohit Singh 2012-06-28 08:16:32

le plus simple de tous

select sal from salary order by sal desc limit 1 offset 1
2
répondu reverbnation 2015-09-10 08:08:03
select min(sal) from emp where sal in 
    (select TOP 2 (sal) from emp order by sal desc)

Note

sal est le col le nom

emp est le nom de la table

1
répondu Ni3 2011-08-06 13:28:49

Tom, croyez que cela échouera quand il y a plus d'une valeur retournée dans la section select max([COLUMN_NAME]) from [TABLE_NAME] . c'est-à-dire lorsqu'il y a plus de deux valeurs dans l'ensemble de données.

légère modification à votre requête fonctionnera -

select max([COLUMN_NAME]) from [TABLE_NAME] where [COLUMN_NAME] **IN** 
  ( select max([COLUMN_NAME]) from [TABLE_NAME] )
1
répondu sunith 2011-08-06 13:29:59
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));

renvoie toutes les valeurs autres que la plus grande. sélectionnez la valeur max de la liste retournée.

1
répondu sunith 2011-08-06 13:30:43
select col_name
from (
    select dense_rank() over (order by col_name desc) as 'rank', col_name
    from table_name ) withrank 
where rank = 2
1
répondu Divya.N.R 2012-04-03 09:55:50
SELECT 
    * 
FROM 
    table 
WHERE 
    column < (SELECT max(columnq) FROM table) 
ORDER BY 
    column DESC LIMIT 1
1
répondu avie sparrows 2012-10-23 16:33:20

C'est la voie la plus sûre:

SELECT
      Column name
FROM
      Table name 
ORDER BY 
      Column name DESC
LIMIT 1,1
1
répondu Ravind Maurya 2013-08-23 18:28:41

comme vous avez mentionné les valeurs dupliquées . Dans ce cas, vous pouvez utiliser groupe DISTINCT et par pour trouver la deuxième valeur la plus élevée

voici un tableau

salaire

:

enter image description here

GROUPE PAR

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

première partie de la limite = indice de départ

deuxième portion de la limite = combien de valeurs

1
répondu Sourov Datta 2016-12-06 16:03:12

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

pas besoin de requêtes secondaires ... il suffit de sauter une rangée et de sélectionner la deuxième rangée après l'ordre en descendant

1
répondu Justin Jose 2017-07-13 11:31:10

quelque chose comme ça? Je ne l'ai pas testé, cependant:

select top 1 x
from (
  select top 2 distinct x 
  from y 
  order by x desc
) z
order by x
0
répondu doekman 2008-08-28 12:45:30

Voir Comment choisir la nième ligne dans une table de base de données SQL? .

Sybase SQL Anywhere supports:

SELECT TOP 1 START AT 2 value from table ORDER BY value
0
répondu Graeme Perrow 2017-05-23 10:31:17

utilisant une requête corrélée:

Select * from x x1 where 1 = (select count(*) from x where x1.a < a)
0
répondu sth 2009-09-16 00:16:28
select * from emp e where 3>=(select count(distinct salary)
    from emp where s.salary<=salary)

cette requête sélectionne les trois salaires maximum. Si deux emp a obtenir le même salaire, cela n'affecte pas la requête.

0
répondu sth 2009-09-16 00:17:28
select top 1 MyIntColumn from MyTable
where
 MyIntColumn <> (select top 1 MyIntColumn from MyTable order by MyIntColumn desc)
order by MyIntColumn desc
0
répondu Chris Conway 2009-09-16 00:18:25

cela fonctionne dans MS SQL:

select max([COLUMN_NAME]) from [TABLE_NAME] where [COLUMN_NAME] < 
 ( select max([COLUMN_NAME]) from [TABLE_NAME] )
0
répondu Tom Welch 2009-09-16 00:18:50

requête pour trouver le deuxième nombre le plus élevé dans une rangée -

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

en changeant le surligné Top 1 en TOP 2 , 3 ou 4 u peut trouver le 3ème, 4ème et 5ème plus haut respectivement.

0
répondu nikita 2013-03-25 06:55:17

nous pouvons également faire usage de l'ordre par et top 1 élément comme suit:

Select  top 1 col_name from table_name
where col_name < (Select top 1 col_name from table_name order by col_name desc)
order by col_name desc 
0
répondu Abhishek Gahlout 2013-04-23 10:54:26
SELECT * FROM EMP
WHERE salary=
        (SELECT MAX(salary) FROM EMP
           WHERE salary != (SELECT MAX(salary) FROM EMP)
        );
0
répondu ReeSen 2013-05-13 07:21:44

C'est une autre façon de trouver la deuxième plus grande valeur d'une colonne.Considérons le tableau "étudiant" et la colonne "âge".Alors la requête est,

select top 1 Age from Student where Age in(select distinct top 2 Age  from Student order by Age desc) order by Age asc
0
répondu Pearl90 2013-08-15 08:07:54