Quelle est la requête SQL la plus simple pour trouver la deuxième plus grande valeur?
30 réponses
SELECT MAX( col )
FROM table
WHERE col < ( SELECT MAX( col )
FROM table )
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 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
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;
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.
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
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
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;
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.
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
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.....
le plus simple de tous
select sal from salary order by sal desc limit 1 offset 1
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
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] )
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.
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
C'est la voie la plus sûre:
SELECT
Column name
FROM
Table name
ORDER BY
Column name DESC
LIMIT 1,1
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
:
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
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
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
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
utilisant une requête corrélée:
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 les trois salaires maximum. 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 dans MS SQL:
select max([COLUMN_NAME]) from [TABLE_NAME] where [COLUMN_NAME] <
( select max([COLUMN_NAME]) from [TABLE_NAME] )
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.
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
SELECT * FROM EMP
WHERE salary=
(SELECT MAX(salary) FROM EMP
WHERE salary != (SELECT MAX(salary) FROM EMP)
);
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