用于从每个部门选择员工的SQL查询

用于从每个部门选择员工的SQL查询,sql,sql-server,Sql,Sql Server,我试图查询一个查询,以选择每个部门中最老的员工。我能够连接所有的表,并获得我想要的列。我不仅需要选择每个部门最早的开始日期。如果两名员工的开始日期相同,也列出他们 我试着从employment history表中进行子查询,比如说employee ID位于MIN(s.startDate)。这抓住了我的全部 以下是我的首选声明: SELECT e.FirstName, e.LastName, MIN(edh.StartDate), department.Name FROM..... 这

我试图查询一个查询,以选择每个部门中最老的员工。我能够连接所有的表,并获得我想要的列。我不仅需要选择每个部门最早的开始日期。如果两名员工的开始日期相同,也列出他们

我试着从employment history表中进行子查询,比如说employee ID位于
MIN(s.startDate)
。这抓住了我的全部

以下是我的首选声明:

SELECT 
    e.FirstName, e.LastName, MIN(edh.StartDate), department.Name
FROM.....
这是使用
AdventureWorks
示例数据库:


假设您使用的是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。如果您想根据某些条件(字母名称)排除领带,请按顺序将其包括在内,以便Alice总是得到1而不是Bob

如果您的sql server非常陈旧,不支持行号,请升级它。您还可以使用该查询查找每个部门(您拥有的部门)的最小开始日期,并将其作为子查询,将其拆分为返回部门id和开始日期所需的内容,然后将其连接回主查询:

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

您可以
按年龄递减对员工进行排序,并从每个部门取第一名:

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

帮助我们帮助您并共享您的表格结构。另外,请在您的问题上加上您正在使用的标签,假设它是SQLS,因为AdventureWorks我以前从未见过这样的琐事:我相信Oracle在1998年左右在8i版中引入了行数。微软花了几年的时间才赶上,但也有一段时间了。非常有用-阅读“sql server窗口功能”