utiliser le décalage à cette fin ... sélectionner l'extension de [dbo]. [Employés] ordre par extension desc offset 2 lignes chercher les 1 lignes suivantes seulement
Jinto John
Réponses:
295
SELECT MAX( col )FROMtableWHERE col <(SELECT MAX( col )FROMtable)
La réponse de Matt ainsi que celle de Vinoy s'occupe également des doublons. Supposons que la plus grande valeur soit répétée, puis l'utilisation de la réponse de Matt produira la deuxième valeur la plus élevée correcte, tandis que si vous avez utilisé l' approche des 2 premières desc et min , vous pouvez obtenir la valeur la plus grande à la place.
Pankaj Sharma
Que faire s'il y a plusieurs secondes plus élevées ... Alors cela ne donnera pas tous les tuples
Parth Satra
2
merci, utilisé ceci pour trouver l'avant-dernière date ici
shaijut
Bien mieux que mon approche utilisant ORDER_BY et LIMIT pour la déclaration intérieure
andig
Notez que cela ne retournera pas de résultat s'il n'y a pas d'enregistrements avant celui demandé.
andig
61
SELECT MAX(col)FROMtableWHERE col NOTIN(SELECT MAX(col)FROMtable);
--filter out the maxselect max( col )from[table]where col <(select max( col )from[table])--sort top two then bottom oneselecttop1 col
from(selecttop2 col
from[table]orderby col) topTwo
orderby 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' maxagrégation.
Alternativement, dans Microsoft SQL 2005 et supérieur, vous pouvez utiliser la ROW_NUMBER()fonction:
select col
from(select ROW_NUMBER()over(orderby 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(SELECTTOP2[column]FROM[Table]GROUPBY[column]ORDERBY[column]DESC) a
C'est ce que j'espérais voir. La réponse acceptée devient moche si vous en avez besoin n. Celui-ci résiste à ce test.
Robin Maben
@RobinMaben Robin, qu'en est-il du scénario lorsque la plus grande valeur est répétée? Supposons qu'une colonne contienne les nombres 1 à 100 mais que 100 soit répété deux fois. Ensuite, cette solution produira la deuxième plus grande valeur comme 100, ce qui sera incorrect. Droite?
Pankaj Sharma
1
@PankajSharma non, cela fonctionnera toujours, à cause de la clause GROUP BY
Joel Coehoorn
C'est la manière standard de procéder. La réponse acceptée doit être mise à jour avec celle-ci.
Guilherme Melo
1
J'obtiens une erreur indiquant que je ne peux pas utiliser TOPet OFFSETdans la même requête.
Spurious
15
Je suppose que vous pouvez faire quelque chose comme:
C'est du code très simple, vous pouvez essayer ceci: -
ex: nom de la table = test
salary
1000150014507500
Code MSSQL pour obtenir la deuxième plus grande valeur
select salary from test orderby salary desc offset 1rowsfetch next 1rows 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.
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 -
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
Réponses:
la source
la source
Dans T-Sql, il y a deux façons:
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:la source
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):
MySQL:
Mettre à jour:
SQL Server 2012 prend désormais en charge une syntaxe OFFSET / FETCH beaucoup plus propre (et standard ):
la source
n
. Celui-ci résiste à ce test.TOP
etOFFSET
dans la même requête.Je suppose que vous pouvez faire quelque chose comme:
ou
en fonction de votre serveur de base de données. Astuce: SQL Server ne fait pas LIMIT.
la source
OFFSET 2
Le plus simple serait d'obtenir la deuxième valeur de ce jeu de résultats dans l'application:
Mais si vous devez sélectionner la deuxième valeur à l'aide de SQL, que diriez-vous:
la source
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
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
la source
Une requête très simple pour trouver la deuxième plus grande valeur
la source
MSSQL
MySQL
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
la source
Cette requête renverra le salaire maximum, à partir du résultat - qui ne contient pas le salaire maximum de la table globale.
la source
Ancienne question que je connais, mais cela m'a donné un meilleur plan exécutif:
la source
C'est du code très simple, vous pouvez essayer ceci: -
ex: nom de la table = test
Code MSSQL pour obtenir la deuxième plus grande valeur
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.
la source
J'espère que cela vous aidera à obtenir la valeur de n'importe quelle ligne .....
la source
Le plus simple de tous
la source
Remarque
sal est le nom de la
colonne emp est le nom de la table
la source
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 -
la source
la sous-requête renvoie toutes les valeurs autres que la plus grande. sélectionnez la valeur maximale dans la liste renvoyée.
la source
la source
la source
C'est le moyen le plus simple:
la source
la source
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
:
Première partie de LIMIT = index de départ
Deuxième partie de LIMIT = combien de valeur
la source
cela retournera le troisième sal le plus élevé de la table emp
la source
not in est une condition qui exclut la valeur la plus élevée de nom_colonne.
Référence: interview de programmeur
la source
Quelque chose comme ça? Je ne l'ai pas testé, cependant:
la source
Consultez Comment sélectionner la nième ligne dans une table de base de données SQL? .
Sybase SQL Anywhere prend en charge:
la source
À l'aide d'une requête corrélée:
la source
Cette requête sélectionne les trois salaires maximum. Si deux emp reçoivent le même salaire, cela n'affecte pas la requête.
la source
la source
Cela fonctionne dans MS SQL:
la source