how to get second highest salary department wise without using analytical functions?

前端 未结 11 1867
孤独总比滥情好
孤独总比滥情好 2021-01-06 03:08

Suppose we have 3 employees in each department.we have total 3 departments . Below is the sample source table

Emp deptno salary
A    10     1000
B    10              


        
相关标签:
11条回答
  • 2021-01-06 04:05

    Create table and insert dummy data

    CREATE TABLE #Employee
    (
     Id Int,
     Name NVARCHAR(10), 
     Sal int, 
     deptId int
    )
    
    
    INSERT INTO #Employee VALUES
    (1, 'Ashish',1000,1),
    (2,'Gayle',3000,1),
    (3, 'Salman',2000,2),
    (4,'Prem',44000,2)
    

    Query to get result

     ;WITH cteRowNum AS (
    SELECT *,
           DENSE_RANK() OVER(PARTITION BY deptId ORDER BY Sal DESC) AS RowNum
        FROM #Employee
     )
     SELECT *
     FROM cteRowNum
     WHERE RowNum = 2;
    
    0 讨论(0)
  • 2021-01-06 04:05
    CREATE TABLE Employee
        ([Name] varchar(1), [Dept] varchar(1), [Salary] int)
    ;
    
    INSERT INTO Employee
        ([Name], [Dept], [Salary])
    VALUES
        ('a', 'M', 20),
        ('b', 'M', 25),
        ('c', 'M', 30),
        ('d', 'C', 44),
        ('e', 'C', 45),
        ('f', 'C', 46),
        ('g', 'H', 20)
    
    0 讨论(0)
  • 2021-01-06 04:08

    Solution using Correlated Subquery:

    SELECT * FROM emp e1 WHERE 2 = (SELECT COUNT(DISTINCT sal)
                                      FROM emp e2 
                                     WHERE e1.sal <= e2.sal
                                       AND e1.deptno = e2.deptno
                                   );
    
    0 讨论(0)
  • 2021-01-06 04:10

    Quite straightforward and declarative, but slow

    select 
      t1.*
    from 
      #tmp t1
      inner join #tmp h1 on h1.dept = t1.dept and h1.emp <> t1.emp
      left outer join #tmp h2 on h2.dept = h1.dept and h2.salary > h1.salary
      left outer join #tmp t2 on t1.dept = t2.dept and t2.salary > t1.salary and t2.emp <> h1.emp
    where 
      t2.emp is null and h2.emp is null
    
    0 讨论(0)
  • 2021-01-06 04:10

    Very simple logic.

    Please try:

    SELECT dept as dd, ( SELECT ee.salary FROM `employees` as ee WHERE ee.dept=dd 
    ORDER BY ee.salary DESC LIMIT 1,1 ) as sndHigh 
    FROM `employees` 
    WHERE 1 
    GROUP BY dept
    
    0 讨论(0)
提交回复
热议问题