Quelle est la requête SQL la plus simple pour trouver la deuxième valeur entière la plus grande dans une colonne spécifique?
Il y a peut-être des valeurs en double dans la colonne.
Quelle est la requête SQL la plus simple pour trouver la deuxième valeur entière la plus grande dans une colonne spécifique?
Il y a peut-être des valeurs en double dans la colonne.
Réponses:
SELECT MAX( col )
FROM table
WHERE col < ( SELECT MAX( col )
FROM table )
Dans 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 méthode est deux fois plus rapide que la seconde, même si la colonne en question est groupée.
Cela est dû au fait que l'opération de tri est relativement lente par rapport à l'analyse de table ou d'index utilisée par l' max
agrégation.
Alternativement, dans Microsoft SQL 2005 et supérieur, vous pouvez utiliser la 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 ici à la fois des solutions spécifiques à SQL Server et des solutions spécifiques à MySQL, vous voudrez peut-être clarifier la base de données dont vous avez besoin. Cependant, si je devais deviner, je dirais SQL Server car c'est trivial dans MySQL.
Je vois aussi des solutions qui ne fonctionneront pas car elles ne prennent pas en compte la possibilité de doublons, alors faites attention à celles que vous acceptez. Enfin, j'en vois quelques-uns qui fonctionneront mais qui feront deux scans complets de la table. Vous voulez vous assurer que la deuxième analyse ne regarde que 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
Mettre à jour:
SQL Server 2012 prend désormais en charge une syntaxe OFFSET / FETCH beaucoup plus propre (et standard ):
SELECT TOP 2 [column]
FROM [Table]
GROUP BY [column]
ORDER BY [column] DESC
OFFSET 1 ROWS
FETCH NEXT 1 ROWS ONLY;
n
. Celui-ci résiste à ce test.
TOP
et OFFSET
dans la même requête.
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. Astuce: SQL Server ne fait pas LIMIT.
OFFSET 2
Le plus simple serait d'obtenir la deuxième valeur de ce jeu de résultats dans l'application:
SELECT DISTINCT value FROM Table ORDER BY value DESC LIMIT 2
Mais si vous devez sélectionner la deuxième valeur à l'aide de SQL, que diriez-vous:
SELECT MIN(value) FROM (SELECT DISTINCT value FROM Table ORDER BY value DESC LIMIT 2) AS t
LIMIT
est la syntaxe MySql, la question ne spécifie pas de version SQL.
vous pouvez trouver la deuxième plus grande valeur de 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
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 les secondes lignes après l'ordre par ordre décroissant
SELECT MAX(Salary) FROM Employee WHERE Salary NOT IN (SELECT MAX(Salary) FROM Employee )
Cette requête renverra le salaire maximum, à partir du résultat - qui ne contient pas le salaire maximum de la table globale.
C'est du code très simple, vous pouvez essayer ceci: -
ex: nom de la table = test
salary
1000
1500
1450
7500
Code MSSQL pour obtenir la deuxième plus grande valeur
select salary from test order by salary desc offset 1 rows fetch next 1 rows only;
ici 'offset 1 rows' signifie la 2ème ligne du tableau et 'fetch next 1 rows only' est pour afficher uniquement cette 1 ligne. si vous n'utilisez pas «récupérer les 1 lignes suivantes seulement», il affiche toutes les lignes de la deuxième ligne.
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
J'espère que cela vous aidera à obtenir la valeur de n'importe quelle ligne .....
Tom, je crois que cela échouera lorsqu'il y aura plus d'une valeur retournée dans la select max([COLUMN_NAME]) from [TABLE_NAME]
section. c'est-à-dire où il y a plus de 2 valeurs dans l'ensemble de données.
Une légère modification de votre requête fonctionnera -
select max([COLUMN_NAME]) from [TABLE_NAME] where [COLUMN_NAME] **IN**
( select max([COLUMN_NAME]) from [TABLE_NAME] )
SELECT
*
FROM
table
WHERE
column < (SELECT max(columnq) FROM table)
ORDER BY
column DESC LIMIT 1
C'est le moyen le plus simple:
SELECT
Column name
FROM
Table name
ORDER BY
Column name DESC
LIMIT 1,1
Comme vous l'avez mentionné, les valeurs en double. Dans ce cas, vous pouvez utiliser DISTINCT et GROUP BY pour trouver la deuxième valeur la plus élevée
Voici un tableau
un salaire
:
PAR GROUPE
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 LIMIT = index de départ
Deuxième partie de LIMIT = combien de valeur
select max(column_name) from table_name
where column_name not in (select max(column_name) from table_name);
not in est une condition qui exclut la valeur la plus élevée de nom_colonne.
Référence: interview de programmeur
Consultez 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
select top 1 MyIntColumn from MyTable
where
MyIntColumn <> (select top 1 MyIntColumn from MyTable order by MyIntColumn desc)
order by MyIntColumn desc