2016-03-21 52 views
0

這是迄今爲止的情況。我應該顯示出公司中第四高(僅第四,而不是前四)。但是我不想使用子查詢。那就是問題所在。我似乎無法找到一種方法來展示第四名。是否可以在這種情況下顯示我想要的特定行?

這是當前的代碼,我有

SELECT TOP 5 E1.BusinessEntityID, SUM(E2.PayFrequency*E2.Rate) AS Pay 
FROM HumanResources.EmployeePayHistory AS E1 
INNER JOIN HumanResources.EmployeePayHistory AS E2 
ON E1.BusinessEntityID=E2.BusinessEntityID 
GROUP BY E1.BusinessEntityID 
ORDER BY SUM(E2.PayFrequency*E2.Rate) DESC 

預先感謝您

+0

爲什麼你不想使用子查詢?就像你說我不想使用數據庫。你的rdbms是什麼? –

+0

其實這對我們大學來說是一個挑戰,似乎沒有人能夠回答。 使用AdventureWorks 2014 btw – Chessbrain

+0

你可以在不同的RBDMS中找到AdventureWorks,我的意思是你使用SqlServer,Postgres,MySQL ...以及哪個版本? –

回答

4

OFFSET/FETCH會做到這一點很容易:

SELECT TOP 5 E1.BusinessEntityID, SUM(E2.PayFrequency*E2.Rate) AS Pay 
FROM HumanResources.EmployeePayHistory AS E1 
INNER JOIN HumanResources.EmployeePayHistory AS E2 
    ON E1.BusinessEntityID=E2.BusinessEntityID 
GROUP BY E1.BusinessEntityID 
ORDER BY SUM(E2.PayFrequency*E2.Rate) DESC 
OFFSET 3 ROWS FETCH NEXT 1 ROWS ONLY; 
+0

Omg,非常感謝...我一直在Google上搜尋幾個小時,試圖找到一種方法。找到LAST_VALUE和其他東西,但沒有人工作。你不知道我多麼感恩。 – Chessbrain

+0

我認爲沒有必要頂級5 – Paparazzi

+0

@Paparazzi是的,我只是複製/粘貼他已有的東西,並增加了抵消/獲取而沒有過多的關注其餘的。至少TOP 5在這種情況下不會受到傷害。 –

1

你也可以做到這一點使用行號

with cte 
as 
(
SELECT TOP 5 E1.BusinessEntityID, SUM(E2.PayFrequency*E2.Rate) AS Pay,row_number() over (ORDER BY SUM(E2.PayFrequency*E2.Rate) DESC) as rn 
FROM HumanResources.EmployeePayHistory AS E1 
INNER JOIN HumanResources.EmployeePayHistory AS E2 
ON E1.BusinessEntityID=E2.BusinessEntityID 
GROUP BY E1.BusinessEntityID 
ORDER BY SUM(E2.PayFrequency*E2.Rate) DESC 
) 
select * from cte where rn=4 
+0

非常感謝你......你剛剛給了我新的方式來玩SQL。 :D – Chessbrain

+1

這可能是課堂挑戰之後的真正原因,但是我認爲CTE是另一種子查詢。 –

+0

有趣,謝謝你的信息。 – Chessbrain

相關問題