2012-03-13 101 views
0

您能帮我吗?需要得到员工的薪水最高的列表,按年龄,姓氏和名字样品根据年龄查询显示员工的最高工资

输入:

Age  FirstName  LastName  SAL  
---------- ---------- ---------- ---------- 
30   Andy   Donald  175  
31   Petr   Pess   295  
30   John   Jacky   453  
31   Bob   Bobby   385  
29   Eric   Rice   957 

答案应该是提前

Age  FirstName  LastName  SAL  
---------- ---------- ---------- ---------- 
31   Bob   Bobby   385  
30   John   Jacky   453  
29   Eric   Rice   957  

谢谢

+0

这是功课?如果是这样,你应该包括作业标签。你有什么尝试,没有奏效。检查如何提出一个好问题的常见问题:http://stackoverflow.com/questions/how-to-ask – 2012-03-13 15:18:12

+0

@AdamPorad,我开始认为,当用户不包括RDBMS特定的标记时,它必须是功课。 :) – 2012-03-13 15:22:42

回答

3

获得所有员工,其中没有同龄雇员,薪水更高:

SELECT * 
FROM employees e1 
WHERE NOT EXISTS (
    SELECT 1 
    FROM employees e2 
    WHERE e1.age = e2.age 
    AND e1.sal < e2.sal 
) 
ORDER BY age DESC 

如果两个员工具有相同的年龄工资,都将被退回......这个查询任何数据库上运行

3

如果有可用的窗口/分析功能(你不提的在OP RDBMS),你可以做到以下几点:

SELECT * FROM (
    SELECT Age, FirstName, LastName, SAL 
     , DENSE_RANK() OVER (PARTITION BY Age ORDER BY SAL DESC) AS ranknum 
     FROM employees 
) WHERE ranknum = 1 

这将工作,即使同龄的两个或两个以上的员工具有相同的薪水 - 两者都将被退回。如果您愿意,它也可以让您获得第二高的薪水等(只需将ranknum = 1更改为ranknum = 2等)。至少可以在Oracle,SQL Server和PostgreSQL中使用。仅供参考,如果您使用的是Oracle,SQL Server和PostgreSQL,则可以使用此功能。

+0

为'DENSE_RANK()'+1,这对我来说是一个新的。 – 2012-03-13 15:28:58

+0

它也将在DB2和Sybase SQL Anywhere中工作... – 2012-03-13 15:30:04

+0

@LukasEder,很高兴知道。 – 2012-03-13 15:30:49

0

如果你正在使用MySQL,下面应该工作:

select * from 
(select * from myTable order by age desc, sal desc) sq 
group by age 

(虽然它不会在同样的薪水返回相同年龄的员工多行)

+0

只是好奇,但你能解释它是如何工作的?外部选择包含未汇总的字段?使用GROUP BY时我甚至不认为这是有效的SQL? – njr101 2012-03-13 15:47:15

+0

它只在MySQL中有效,据我所知 - 分组MySQL查询中的未分组字段具有返回组中第一行的值。 – 2012-03-13 15:58:13

+0

谢谢,我从来不知道。这为许多查询的一些新颖解决方案提供了很多可能性。 – njr101 2012-03-13 16:02:48

相关问题