SQL查询以从每个部门中选择员工

时间:2019-07-16 04:30:30

标签: sql sql-server

我正在尝试查询查询以选择每个部门中最老的员工。我能够加入所有表,并获得我想要的列。我不仅需要选择每个部门最早的开始日期。如果两个雇员的开始日期相同,则也将其列出。

我尝试从就业历史记录表中查询雇员ID为IN MIN(s.startDate)的子查询。这会占用全部MIN

这是我的首选语句:

SELECT 
    e.FirstName, e.LastName, MIN(edh.StartDate), department.Name
FROM.....

这是使用AdventureWorks示例数据库:

https://moidulhassan.files.wordpress.com/2014/07/adventureworks2008_schema.gif

2 个答案:

答案 0 :(得分:0)

假设您使用的是sql server,这是一个相对较新的版本:

SELECT * FROM
(
  SELECT *, ROW_NUMBER() OVER(PARTITION BY department.name ORDER BY edh.startdate) rown 
  FROM ...
) x
WHERE x.rown = 1

行号分析将创建一个数字列,第1列是最早的开始日期和顺序。该分区使每个部门的行编号从1开始。然后,我们只选择所有编号为1的行。如果您想建立关系(两个人最早在同一日期开始),请使用RANK而不是ROW_NUMBER。如果您要基于某些条件(字母名字)排除联系,请按以下顺序将其包括在内,以便爱丽丝总是得到1而不是鲍勃

如果您的sql server非常古老,它不支持row_number,请对其进行升级。您还可以使用该查询来找到每个部门(您拥有的部门)的最小开始日期,并将其作为子查询,将其剥离为返回部门ID和开始日期所需的条件,然后将其重新加入到主要查询:

SELECT * FROM
(
  SELECT departmentid, MIN(startdate) as mindate FROM ... ) x
INNER JOIN
...
ON ...departmentid = x.departmentid AND ...startdate = x.mindate

答案 1 :(得分:0)

您可以rank按年龄下降的员工,然后从每个部门中提取第一个员工:

SELECT FirstName, LastName, BirthDate, DepatmetnName
FROM   (SELECT p.FirstName AS FirstName, 
               p.LastName AS LastName,
               e.BirthDate AS BirthDate,
               d.Name AS DepartmentName,
               RANK() OVER (PARTITION BY d.DepartmentID ORDER BY e.BirthDate DESC) AS rk
        FROM   Person p
        JOIN   Employee e ON p.BusinessEntityID = e.BusinessEntityID
        JOIN   EmployeeDepartmentHistory edh ON e.BusinessEntityID = edh.BusinessEntityID AND
                                                edh.EndDate IS NULL
        JOIN   Department d ON edh.DepartmentID = d.DerpartmentID) t
WHERE  rk = 1