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

相关问题