Quel est le plus simple Requête SQL pour trouver la deuxième plus grande valeur?
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.
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
:
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.