查询以检索特定月份员工的姓名和最高工资

时间:2019-02-06 06:04:00

标签: postgresql

我有两个表emp和薪金。

select * from emp;
 id  |  name  
 -----+--------
 111 | Ashika
 222 | banu
 333 | charu
 444 | dhji

select * from salary;
 id  | sal_id | month |  sal  
 -----+--------+-------+-------
 111 |      1 | jan   | 15000
 111 |      2 | dec   | 14000
 111 |      3 | nov   | 14000
 222 |     13 | jan   | 14000
 222 |     12 | Dec   | 14000
 333 |     22 | Dec   | 14000
 333 |     23 | jan   | 16000
 444 |     33 | jan   | 12000

我想获得在“ jan”月获得最高工资的员工的名字。

我已经厌倦了postgres中的以下查询:

select name,max(sal) as sal from Empp join Salary using(id)where month='jan' group by name;

 name  |  sal  
--------+-------
 charu  | 16000
 Ashika | 15000
 dhji   | 12000
 banu   | 14000

 select max(sal) from (select name,max(sal) as sal from Empp join Salary using(id)where month='jan'group by name) as foo;
  max  
 -------
 16000
(1 row)

我希望从表中检索姓名和工资。

Excepted output:
name  |  sal  
-------+-------
charu | 16000

4 个答案:

答案 0 :(得分:2)

我将在此处使用$this->db->getPDOConnection()->run(...etc);

ROW_NUMBER

答案 1 :(得分:1)

@ishika,我想您是在询问不使用“ With”键的查询。

这是更新的答案:-    1.使用CTE

WITH cte AS (
 SELECT e.name, s.salary
 FROM emp e
 INNER JOIN salary s
  ON e.id = s.emp_id    
 WHERE s.month = 'jan'  
)     
SELECT top 1 name, salary
FROM cte order by salary desc

2。不使用CTE

SELECT TOP 1 name, salary 
FROM (SELECT e.name, s.salary
      FROM emp e
      INNER JOIN salary s
      ON e.id = s.emp_id    
      WHERE s.month = 'jan') my_selected_data
ORDER BY salary DESC

答案 2 :(得分:0)

WITH result AS 
(SELECT e.name, s.sal  FROM empp e 
INNER JOIN 
salary s ON e.id = s.id WHERE s.month = 'jan')
SELECT name,sal FROM result 
where sal = (select max(sal) from (select name,max(sal) as sal 
from Empp join Salary using(id)where month='jan' 
group by name) as foo);

答案 3 :(得分:0)

最简单的查询:

name  |  sal  
-------+-------
charu | 16000
(1 row)

输出:

{{1}}