206 votes

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

Quelle est la requête SQL plus simple pour trouver la deuxième plus grande valeur entière dans une colonne spécifique ? Bien sûr, il peut y avoir des valeurs dupliquées dans la colonne.

371voto

Matt Rogish Points 11824
SELECT MAX( col )
  FROM table
 WHERE col < ( SELECT MAX( col )
                 FROM table )

66voto

Vinoy Points 201
SELECT MAX(col) FROM table WHERE col NOT IN (SELECT MAX(col) FROM table);

32voto

Keith Points 46288

Dans T-Sql, il y a deux façons :

Dans Microsoft SQL, la première façon est deux fois plus vite que le second, même si la colonne en question est organisé en clusters.

C’est parce que l’opération de tri est relativement lente comparée à la table ou l’index scan qui le `` utilise l’agrégation.

Dans Microsoft SQL 2005 et ci-dessus, vous pouvez également utiliser le `` fonction :

27voto

Joel Coehoorn Points 190579

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;

21voto

dguaraglia Points 3113

Je suppose que vous pouvez faire quelque chose comme :

ou

selon votre serveur de base de données. Remarque : SQL Server ne fait pas limiter.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X