2012-03-13 102 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

相關問題