2016-12-05 2 views
-1

J'essaie d'obtenir les 3 plus haut salaire de top 5 employés comme celui-ci3e salaire le plus élevé sql

salary 
    35000 
    34000 
    20000 
    12000 
    500 
    40000 
    25000 
    41000 
    90000 
    550000 

requête

select top 5 
    (SELECT MAX(grosssalary) FROM Detail) maxsalary , 
    (SELECT MAX(grosssalary) FROM Detail) sec_max_salary, 
    (SELECT MAX(grosssalary) FROM Detail 
    WHERE grosssalary NOT IN (SELECT MAX(grosssalary) FROM Detail)) as third_max_salary 

mais cela montre des données comme celui-ci

maxsalary sec_max_salary third_max_salary 
550000  550000   41000 

où comme je veux des données comme ça

maxsalary sec_max_salary third_max_salary 
    550000  90000   41000 
+4

Possible dupliquer: http://stackoverflow.com/questions/16234983/how-to-find-third-or-nth-maximum-salary-from -salary-table – thebenman

+0

pouvez-vous vérifier ma réponse @superuser – Chanukya

+0

dupliquer de http://stackoverflow.com/q/16234983/3261852 – Munavvar

Répondre

1

Faites un CTE et obtenir le ROWNUMBER() sur salary DESC et dans la requête externe extraire l'enregistrement avec rownumber égal à 3.

;WITH CTE AS 
(
    SELECT RN = ROW_NUMBER() OVER (ORDER BY salary DESC), 
      Salary 
    FROM [YourTable] 
) 

SELECT Salary 
FROM CTE 
WHERE RN <= 3 

Note: Si vous voulez 3ème utilisation de salaire le plus élevé RN=3 si vous voulez tous top 3 salaire puis utilisez RN<=3

Si vous voulez top 3 salaire le plus élevé, vous pouvez le faire ainsi:

SELECT TOP 3 Salary 
FROM [YourTable] 
ORDER BY Salary DESC 
+0

qu'est-ce que CTE? et ceci est une requête compliquée s'il vous plaît modifier en fonction de ma requête –

+1

@superuser cela vous donnera les 3 meilleurs salaires, mais ils pourraient encore être tous le même salaire. Si vous recherchez les 3 meilleurs salaires, tout ce que vous devez faire est de passer ROW_NUMBER() à DENSE_RANK(). Notez également que l'utilisation de PIVOT avec cette sortie vous permettra d'obtenir 3 colonnes au lieu de lignes. – Matt

0

Utilisez DENSE_RANK() pour commander le salaire, puis utilisez une expression CASE pour trouver les 3 meilleurs salaires.

Recherche

;with cte as(
    select [sal_rank] = dense_rank() over(
     order by [grosssalary] desc 
    ), * 
    from [your_table_name] 
) 
select max(case [sal_rank] when 1 then [grosssalary] end) as [maxsalary], 
max(case [sal_rank] when 2 then [grosssalary] end) as [sec_max_salary], 
max(case [sal_rank] when 3 then [grosssalary] end) as [third_max_salary] 
from cte; 
+0

qu'est-ce que cte ?????? –

+0

@superuser: [Expression de table commune] (https://msdn.microsoft.com/en-IN/library/ms175972.aspx) – Wanderer

+0

RANK() ici pourrait être problématique parce que si 2 personnes partagent le salaire supérieur, il se classerait 1 1 3 donc vous deuxième salaire max serait NULL. Si vous voulez autoriser des liens comme celui-ci, DENSE_RANK() fonctionnerait mieux mais l'agrégation conditionnelle est un bon conseil pour l'OP – Matt

1
CREATE TABLE #A 
(

salary INT 
) 
INSERT INTO #A VALUES 
    (35000), 
    (34000), 
    (20000), 
    (12000), 
    (500 ), 
    (40000), 
    (25000), 
    (41000), 
    (90000), 
    (550000) 


select [1] maxsalary, [2] sec_max_salary, [3] third_max_salary 
from (
SELECT * 
FROM (

    SELECT *, 
      RN = ROW_NUMBER() OVER (ORDER BY Salary DESC) 
    FROM #A 
)a 
WHERE RN <= 3 

) src 
pivot 
(
    MAX(SALARY) 
    for RN in ([1], [2], [3]) 
) piv; 

SORTIE

maxsalary sec_max_salary third_max_salary 
550000  90000   41000 
0

Si vous utilisez SQL SERVER 2012+ utilisez OFFSET

SELECT TOP 1 salary, 
      (SELECT salary FROM Yourtable 
       ORDER BY salary DESC OFFSET 1 ROWS FETCH NEXT 1 ROWS ONLY), 
      (SELECT salary FROM Yourtable 
       ORDER BY salary DESC OFFSET 2 ROWS FETCH NEXT 1 ROWS ONLY) 
FROM Yourtable 
ORDER BY salary DESC 

Si vous voulez juste le salaire le plus élevé 3e puis

SELECT salary 
FROM yourtable 
ORDER BY salary DESC 
OFFSET 2 ROWS FETCH NEXT 1 ROWS ONLY 
-2
select * 
from 
(select * 
    from table 
    order by salary desc 
    limit 3 
) as top_three 
order by top_three.salary asc 
limit 1 
+1

sql-server utilise SELECT TOP pas de limite – Matt

0

Ci-dessous le code vous mènera à obtenir Nième plus grand ou plus petites valeurs de salaire, quel que soit à-dire le type de données. nombre entier ou Vearchar. il suffit de changer le signe '<' pour les petites valeurs n'th.

select * from txt_salary as t1 where 'nth largest' = 
(select count(salary) from txt_salary as t2 where t1.salary<=t2.salary) 
0

pour SQL Server

SELECT e1. * FROM emp e1 OÙ e1.salary = ( sélectionner MIN (e2.salary) de (sélectionner top 3 DISTINCT (e3. salaire) de emp ORDER e3 par e3.salary desc) comme e2 )

Pour MYSQL

SELECT e1.* À partir de emp e1 OÙ e1.salary = ( sélectionner MIN (e2.salary) de (sélectionner DISTINCT (e3.salary) à partir de emp comme ORDRE e3 par e3.salary limite desc 0,3) sous la forme e2 )

0

select max (salaire) comme le plus élevé de l'employé
UNION
select max (salaire) comme 2nd_highest de l'employé où le salaire < (choisir un maximum (salaire) de l'employé) comme 3rd_highest de l'employé
UNION
max (salaire) où salaire < (sélectionnez max (salaire) de l'employé où salar y < (choisir un maximum (salaire) de l'employé)) =

Pour 18 plus haut salaire =
salaire de sélection, Ename, eid DE (sélectionnez e.ename, e.salary, e.eid, rang() OVER (classement par e.eid desc) rank) WHERE rang = 18