Quel est le plus simple Requête SQL pour trouver la deuxième plus grande valeur?

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

  •  09-06-2019
  •  | 
  •  

Question

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

Il y a peut-être des valeurs en double dans la colonne.

Était-ce utile?

La solution

SELECT MAX( col )
  FROM table
 WHERE col < ( SELECT MAX( col )
                 FROM table )

Autres conseils

SELECT MAX(col) FROM table WHERE col NOT IN (SELECT MAX(col) FROM table);

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 le premier moyen est deux fois plus rapide que la seconde, même si la colonne en question est ordonné.

C'est parce que l'opération de tri est relativement lente par rapport à la table ou l'index scan que le max l'agrégation utilise.

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

select col
from (
    select ROW_NUMBER() over (order by col asc) as 'rowNum', col
    from [table] ) withRowNum 
where rowNum = 2

Je vois à la fois spécifique à SQL Server et certains MySQL solutions spécifiques ici, de sorte que vous pouvez clarifier la base de données dont vous avez besoin.Mais si je devais deviner, je dirais que SQL Server puisque c'est trivial dans MySQL.

Je vois aussi quelques solutions qui ne fonctionnent pas parce qu'ils ne parviennent pas à prendre en compte la possibilité pour les doublons, donc attention à ceux qui vous acceptent.Enfin, je vois quelques-uns qui vont travailler, mais qui fera deux balayage complet de la table.Vous voulez vous assurer que la 2ème scan est seulement en regardant les 2 valeurs.

SQL Server (avant 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 permet désormais de beaucoup plus propre (et standard) OFFSET/récupère la syntaxe:

SELECT TOP 2 [column] 
FROM [Table] 
GROUP BY [column] 
ORDER BY [column] DESC
OFFSET 1 ROWS
FETCH NEXT 1 ROWS ONLY;

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)

en fonction de votre serveur de base de données.Conseil:SQL Server ne fait pas de LIMITE.

vous pouvez trouver la deuxième plus grande valeur de la colonne à l'aide de 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

Le plus simple serait d'obtenir la deuxième valeur de cet ensemble de résultats dans l'application:

SELECT DISTINCT value FROM Table ORDER BY value DESC LIMIT 2

Mais si vous devez sélectionner le deuxième valeur à l'aide de SQL, comment à ce sujet:

SELECT MIN(value) FROM (SELECT DISTINCT value FROM Table ORDER BY value DESC LIMIT 2) AS t

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

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 )

Cette requête renvoie le maximum de salaire, à partir du résultat - qui ne contient pas le salaire maximal partir de l'ensemble de la table.

Vieille question, je sais, mais cela m'a permis de mieux exec plan:

 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

Espérons que cela aide à obtenir la valeur de n'importe quelle ligne.....

Le plus simple de tous

select sal from salary order by sal desc limit 1 offset 1

C'est très simple code, vous pouvez essayer ceci :-

ex :Table name = test

salary 

1000
1500
1450
7500

MSSQL Code pour obtenir la 2ème plus grande valeur

select salary from test order by salary desc offset 1 rows fetch next 1 rows only;

voici un décalage de 1 lignes "signifie à la 2e rangée de la table et "fetch next 1 lignes seulement' est pour montrer seulement que 1 ligne.si vous ne faites pas de l' 'fetch next 1 lignes seulement" puis il montre toutes les lignes à partir de la deuxième ligne.

select min(sal) from emp where sal in 
    (select TOP 2 (sal) from emp order by sal desc)

Note

sal est le col de nom
emp est le nom de la table

Tom, croyez cela ne fonctionne pas quand il y a plus d'une valeur renvoyée dans select max([COLUMN_NAME]) from [TABLE_NAME] de la section.c'est à direoù il y a plus de 2 valeurs dans le jeu de données.

Légère modification à votre requête au travail

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

la sous-requête renvoie toutes les valeurs autres que le plus grand.sélectionnez la valeur max de la liste retournée.

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 est le plus esiest façon:

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

Comme vous l'avez mentionné les valeurs en double .Dans ce cas, vous pouvez utiliser DISTINCTES et GROUPE 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

DISTINCTES

SELECT DISTINCT amount
FROM  salary 
ORDER BY  amount DESC 
LIMIT 1 , 1

Première partie de LIMIT = indice de départ

Deuxième partie de la LIMITE = combien de valeur

SELECT MAX(sal) FROM emp
WHERE sal NOT IN (SELECT top 3 sal FROM emp order by sal desc )

ce sera le retour de la troisième plus grande sal de table 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

Pas besoin de sous-requêtes ...il suffit de sauter une ligne et de sélectionner la deuxième lignes après par ordre décroissant

Quelque chose comme cela?Je n'ai pas testé, mais:

select top 1 x
from (
  select top 2 distinct x 
  from y 
  order by x desc
) z
order by x

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

Sybase SQL Anywhere prend en charge:

SELECT TOP 1 START AT 2 value from table ORDER BY value

À l'aide d'une corrélation requête:

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)

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

select top 1 MyIntColumn from MyTable
where
 MyIntColumn <> (select top 1 MyIntColumn from MyTable order by MyIntColumn desc)
order by MyIntColumn desc

Cela fonctionne sous MS SQL:

select max([COLUMN_NAME]) from [TABLE_NAME] where [COLUMN_NAME] < 
 ( select max([COLUMN_NAME]) from [TABLE_NAME] )

Requête pour trouver le 2ème plus grand nombre 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 la surbrillance Top 1 pour TOP 2, 3 ou 4 u peut trouver les 3e, 4e et 5e rang respectivement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top