1
votes

MYSQL récupère toutes les lignes utilisateur ayant un deuxième salaire maximum

J'ai trouvé de nombreuses questions à trouver - deuxième salaire maximum pour les employés. Mais dans tous ces postes, seul le salaire est sélectionné.

id       name       salary
------------------------------------
1        A             100
5        E             100

J'ai besoin que toutes les lignes d'utilisateurs aient un deuxième salaire maximum.

exemple de tableau des utilisateurs

id       name       salary
------------------------------------
1         A             100
2        B              200
3        C              50
4        D              200
5        E              100

et mon résultat attendu est,

select max(salary) from user
WHERE salary NOT IN (SELECT max(salary) from user) 


1 commentaires

Vous pouvez également utiliser SELECT * FROM utilisateur WHERE salaire = (SELECT DISTINCT (salaire) FROM commande utilisateur par salaire DESC LIMIT 1,1)


3 Réponses :


3
votes

Vous pouvez utiliser deux sous-requêtes pour isoler le deuxième salaire le plus élevé, par exemple

WITH cte AS (
    SELECT id, name, salary, DENSE_RANK() OVER (ORDER BY salary DESC) dr
    FROM user
)

SELECT id, name, salary
FROM cte
WHERE dr = 2;

entrez la description de l'image ici

Démo

Notez que si vous utilisez MySQL 8+, et sont ouverts à l'utilisation de fonctions analytiques, alors DENSE_RANK aide vraiment ici:

SELECT id, name, salary
FROM user
WHERE salary = (SELECT MAX(salary) FROM user WHERE salary < (SELECT MAX(salary) FROM user));


2 commentaires

Je n'aime pas la première solution, uniquement parce qu'elle n'est pas évidemment évolutive au 3e, 4e salaire le plus élevé, etc.


@Strawberry Oui ... c'est l'une des raisons pour lesquelles des fonctions analytiques ont été introduites dans SQL pour gérer ce type de problèmes. Oui



-3
votes

vous obtiendrez le 2e salaire maximum par cette requête

SELECT salary FROM user ORDER BY salary DESC LIMIT 1, 1;


1 commentaires

il peut y avoir plus d'un utilisateur avec le même salaire.



1
votes

Vous pouvez faire comme ci-dessous

SELECT * 
FROM   user 
WHERE  salary = (SELECT salary 
                 FROM   user 
                 GROUP  BY salary 
                 ORDER  BY salary DESC 
                 LIMIT  1, 1) 


0 commentaires