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)
3 Réponses :
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;
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));
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
vous obtiendrez le 2e salaire maximum par cette requête
SELECT salary FROM user ORDER BY salary DESC LIMIT 1, 1;
il peut y avoir plus d'un utilisateur avec le même salaire.
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)
Vous pouvez également utiliser
SELECT * FROM utilisateur WHERE salaire = (SELECT DISTINCT (salaire) FROM commande utilisateur par salaire DESC LIMIT 1,1)