Comment trouver le third or nth
salaire maximum du salaire table(EmpID,EmpName,EmpSalary)
de manière optimisée?
sql
sql-server
sql-server-2008
Karan Gandhi
la source
la source
Réponses:
Utilisez
ROW_NUMBER
(si vous en voulez un seul) ouDENSE_RANK
(pour toutes les lignes associées):la source
EmpSalary
colonne. Aussi, réduit par rapport à quoi? L'avantage de l'ROW_NUMBER
approche est que vous pouvez l'utiliser..OVER(PARTITION BY GroupColumn OrderBy OrderColumn)
. Vous pouvez donc l'utiliser pour obtenir des groupes tout en accédant à n'importe quelle colonne.Numéro de ligne:
Requête secondaire:
Top mot-clé:
la source
... WHERE (N-1) = (Subquery)...
travaux. La sous-requête est une requête corrélée puisque saWHERE
clause utiliseEmp1
de la requête principale. La sous-requête est évaluée chaque fois que la requête principale analyse une ligne. Exemple, si nous devons trouver le 3ème salaire le plus élevé (N = 3) à partir de (800, 1000, 700, 750), la sous-requête de la 1ère ligne seraSELECT COUNT(DISTINCT(Emp2.Salary)) FROM Employee Emp2 WHERE Emp2.Salary > 800
égale à 0. Pour la 4ème valeur de salaire (750)... WHERE Emp2.Salary > 750
sera 2, ou N -1, donc cette ligne sera retournée.Essaye ça
Pour 3, vous pouvez remplacer n'importe quelle valeur ...
la source
Si vous voulez optimiser la manière, utilisez le
TOP
mot-clé, donc la nième requête sur les salaires maximum et minimum comme suit, mais les requêtes semblent difficiles comme dans l'ordre inverse en utilisant des noms de fonction d'agrégation:N salaire maximum:
pour Ex: 3 salaire maximum:
N salaire minimum:
pour Ex: 3 salaire minimum:
la source
Trop simple si vous utilisez la sous-requête!
Vous pouvez ici simplement modifier la nième valeur après la contrainte LIMIT.
Ici, la sous-requête Sélectionnez EmpSalary à partir de la commande des employés par EmpSalary DESC Limit 3; retournerait les 3 meilleurs salaires des employés. À partir du résultat, nous choisirons le salaire minimum en utilisant la commande MIN pour obtenir le 3ème salaire TOP de l'employé.
la source
Remplacez N par votre nombre maximum
Explication
La requête ci-dessus peut être assez déroutante si vous n'avez rien vu de tel auparavant - la requête interne est ce qu'on appelle une sous-requête corrélée car la requête interne (la sous-requête) utilise une valeur de la requête externe (dans ce cas, la table Emp1 ) dans sa clause WHERE.
Et source
la source
... WHERE (N-1) = (Subquery)...
travaux. La sous-requête est une requête corrélée puisque saWHERE
clause utiliseEmp1
de la requête principale. La sous-requête est évaluée chaque fois que la requête principale analyse une ligne. Exemple, si nous devons trouver le 3ème salaire le plus élevé (N = 3) à partir de (800, 1000, 700, 750), la sous-requête de la 1ère ligne seraSELECT COUNT(DISTINCT(Emp2.Salary)) FROM Employee Emp2 WHERE Emp2.Salary > 800
égale à 0. Pour la 4ème valeur de salaire (750)... WHERE Emp2.Salary > 750
sera 2, ou N -1, donc cette ligne sera retournée.Troisième ou nième salaire maximum de la table des salaires sans utiliser de sous-requête
Pour le 3e salaire le plus élevé, mettez 2 à la place de N-1
la source
la source
Reportez-vous à la requête suivante pour obtenir le nième salaire le plus élevé. De cette façon, vous obtenez le nième salaire le plus élevé de MYSQL. Si vous souhaitez obtenir le nième salaire le plus bas, vous devez remplacer DESC par ASC dans la requête.
la source
la source
Méthode 1:
Méthode 2:
la source
En 2008, nous pouvons utiliser ROW_NUMBER () OVER (ORDER BY EmpSalary DESC) pour obtenir un rang sans égalité que nous pouvons utiliser.
Par exemple, nous pouvons obtenir le 8ème plus haut de cette façon, ou changer @N en autre chose ou l'utiliser comme paramètre dans une fonction si vous le souhaitez.
Dans SQL Server 2012, comme vous le savez peut-être, cela est effectué de manière plus intuitive à l'aide de LAG ().
la source
la source
C'est l'une des questions les plus fréquentes dans toute interview SQL. Je vais écrire différentes requêtes pour connaître la nième valeur la plus élevée d'une colonne.
J'ai créé une table nommée «Emloyee» en exécutant le script ci-dessous.
Maintenant, je vais insérer 8 lignes dans ce tableau en exécutant ci-dessous une instruction d'insertion.
Nous allons maintenant trouver le 3e Basic_sal le plus élevé du tableau ci-dessus en utilisant différentes requêtes. J'ai exécuté la requête ci-dessous dans le studio de gestion et ci-dessous est le résultat.
Nous pouvons voir dans l'image ci-dessus que le 3e salaire de base le plus élevé serait de 8500. J'écris 3 façons différentes de faire la même chose. En exécutant les trois requêtes mentionnées ci-dessous, nous obtiendrons le même résultat, soit 8500.
Première manière: - Utilisation de la fonction de numéro de ligne
la source
Je montre le 3e salaire le plus élevé
la source
la source
--nième salaire le plus élevé
- (nième -1) salaire le plus élevé
la source
Méthode optimisée: au lieu de sous-requête, utilisez simplement limit.
Voir la syntaxe des limites ici http://www.mysqltutorial.org/mysql-limit.aspx
la source
Pour obtenir la troisième valeur la plus élevée de la table
la source
Par sous-requête:
la source
Essayez cette requête
Mettez n = quelle valeur vous voulez
la source
la source
Solution testée par MySQL, supposons N = 4:
Un autre exemple:
la source
Essayez ce code: -
la source
Remplacez n par le nième salaire le plus élevé comme nombre.
la source
Essaye celui-là...
la source
Pour le 2ème salaire le plus élevé, remplacez 3 par 2 dans la requête ci-dessus et pour le Nème salaire le plus élevé en N où N = 1,2,3,4 ....
la source
SELECT * FROM (sélectionnez le salaire distinct des clients par ordre de salaire DESC) limite 4,1;
Limiter 4,1 signifie laisser les 4 premières lignes, puis sélectionner la suivante.
La limite et le nombre de rang dépendent de la plate-forme que vous utilisez.
Essayez ceci, cela fonctionnera.
la source
REMARQUE: veuillez remplacer OFFSET 3 dans la requête par TOUT Nième nombre entier
La description
retourne seulement 1 ligne
exclure les 3 premiers enregistrements Ici vous pouvez vous n'importe quel nombre entier
la source
Les sous-requêtes prennent toujours plus de temps:
utilisez la requête ci-dessous pour obtenir les données les plus élevées et les plus basses:
Données les plus élevées:
select *from business order by id desc limit 3,1;
Données les plus basses:
select *from business order by id asc limit 3,1;
Peut utiliser N à la place de 3 pour obtenir des nièmes données.
la source