You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

获取员工最新任职日期单条记录的SQL查询需求及语句验证

问题分析与解决方案

首先来看你提供的现有查询语句,它不能满足需求,问题出在这两个关键点:

  • 子查询中的GROUP BY IDNo,position,salary,projectid会把不同职位、薪资、项目的记录单独分组,无法保证只拿到该员工最新任职日期对应的单条记录,反而可能返回多条结果。
  • 额外关联了ProjectTB,但需求里并没有要求展示项目相关字段,属于多余关联。

正确的SQL方案

针对你的需求(查询特定员工的最新任职记录,指定展示字段),这里提供两种简洁可靠的实现方式:

方式1:使用TOP 1 + ORDER BY(适配单员工查询场景)

因为你已经明确指定查询lastname='lian'且firstname='nez'的员工,直接按任职日期倒序取第一条即可:

SELECT 
  s.lastname,
  s.firstname,
  ea.datestarted,
  ea.position,
  ea.salary
FROM constructiondb.dbo.employeetb s
JOIN constructiondb.dbo.eassignmenttb ea ON s.IDNo = ea.IDNo
WHERE s.lastname = 'lian' AND s.firstname = 'nez'
ORDER BY ea.datestarted DESC
TOP 1

方式2:使用窗口函数ROW_NUMBER()(适配通用场景,支持批量查询多员工最新记录)

如果后续需要扩展到查询多个员工的最新任职记录,窗口函数的方式更灵活通用:

WITH LatestAssignment AS (
  SELECT 
    ea.IDNo,
    ea.datestarted,
    ea.position,
    ea.salary,
    -- 按员工ID分区,按任职日期倒序排序,最新记录排第1位
    ROW_NUMBER() OVER (PARTITION BY ea.IDNo ORDER BY ea.datestarted DESC) AS rn
  FROM constructiondb.dbo.eassignmenttb ea
)
SELECT 
  s.lastname,
  s.firstname,
  la.datestarted,
  la.position,
  la.salary
FROM constructiondb.dbo.employeetb s
JOIN LatestAssignment la ON s.IDNo = la.IDNo
WHERE s.lastname = 'lian' AND s.firstname = 'nez' AND la.rn = 1

结果验证

用你提供的样本数据测试上述方案,都会返回期望的结果:

lastname firstname datestarted position salary
lian nez 2015-06-02 Foreman 10000

内容的提问来源于stack exchange,提问作者jade023

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:48:28