首页 > 解决方案 > 具有聚合函数的 1 对多 Select 查询(Adventure Works 数据库)

问题描述

我正在使用 Adventure Works 数据库练习我的 SQL。我的任务很简单。我想找一个员工,看看他们赚了多少钱。

名字| 姓氏| 年龄| 工资率|

问题是工资率位于与员工 (EmployeePayHistory) 具有一对多关系的表中,列 ModifiedDate。我想获取最新的 ModifiedDate 但我没有尝试过任何工作。我一直在关注子查询中的聚合函数


SELECT e.BusinessEntityID,p.FirstName [First Name], p.LastName [Last Name], DATEDIFF(YEAR,e.BirthDate, GETDATE() )[Age],
(SELECT eph1.Rate FROM HumanResources.EmployeePayHistory eph1 HAVING eph1.Rate = MAX(eph.ModifiedDate))
FROM Person.Person p 
JOIN HumanResources.Employee e ON p.BusinessEntityID = e.BusinessEntityID
JOIN HumanResources.EmployeePayHistory eph ON e.BusinessEntityID = eph.BusinessEntityID
GROUP BY e.BusinessEntityID, p.FirstName,p.LastName, DATEDIFF(YEAR,e.BirthDate, GETDATE() )

标签: sqlsql-servertsqlgreatest-n-per-groupadventureworks

解决方案


这是每组最大 n 个问题。不要考虑聚合:考虑过滤。

我想这可以满足您的要求:

SELECT 
    e.BusinessEntityID
    p.FirstName [First Name], 
    p.LastName [Last Name], 
    DATEDIFF(YEAR,e.BirthDate, GETDATE()) [Age],
    (
        SELECT TOP (1) eph.Rate 
        FROM HumanResources.EmployeePayHistory eph 
        WHERE eph.BusinessEntityID = p.BusinessEntityID
        ORDER BY eph.ModifiedDate DESC
    ) [LatestRate]
FROM Person.Person p 
JOIN HumanResources.Employee e ON p.BusinessEntityID = e.BusinessEntityID

Person注意:您没有确切说明和之间的关系Employee- 上面假设这是一个 1-1 关系。


推荐阅读