Oracle SQL:如何仅显示员工最新工作区域且每行唯一
解决方案
方法1:使用窗口函数(推荐,适用于MySQL 8+、PostgreSQL、SQL Server等支持窗口函数的数据库)
假设你的employees表包含employee_id(员工唯一标识)、name、region、work_start_date(该区域工作的起始日期,用于判断最新记录)字段。通过窗口函数给每个员工的记录按日期倒序排名,筛选出排名为1的最新区域记录,再按区域统计数量:
WITH latest_employee_regions AS ( SELECT employee_id, name, region, ROW_NUMBER() OVER (PARTITION BY employee_id ORDER BY work_start_date DESC) AS rn FROM employees ) SELECT region, COUNT(DISTINCT employee_id) AS employee_count FROM latest_employee_regions WHERE rn = 1 GROUP BY region;
逻辑说明
PARTITION BY employee_id:按员工分组,确保每个员工的记录单独排序ORDER BY work_start_date DESC:同一员工的记录按工作起始日期倒序排列,最新的记录排第1位rn = 1:筛选出每个员工的最新区域记录,后续基于该结果按区域统计员工数
如果用work_end_date(结束日期)判断最新状态(比如当前在职的员工work_end_date为NULL),可调整排序条件:
ROW_NUMBER() OVER (PARTITION BY employee_id ORDER BY COALESCE(work_end_date, '9999-12-31') DESC) AS rn
方法2:兼容旧版本数据库(无窗口函数支持)
如果你的数据库不支持窗口函数(如MySQL 5.x),可通过关联子查询获取每个员工的最新工作日期,再匹配对应区域:
SELECT e.region, COUNT(DISTINCT e.employee_id) AS employee_count FROM employees e INNER JOIN ( SELECT employee_id, MAX(work_start_date) AS latest_date FROM employees GROUP BY employee_id ) latest ON e.employee_id = latest.employee_id AND e.work_start_date = latest.latest_date GROUP BY e.region;
注意事项
- 若同一员工在同一日期有多个区域记录(极端场景),需结合
DISTINCT或业务逻辑调整(比如用MAX(region)取区域,需确认业务合理性)
核心前提
- 必须有员工唯一标识字段(如
employee_id),不能仅依赖姓名(避免重名导致错误) - 必须有时间排序字段(如入职日期、工作起止日期),否则无法定义“最新”区域
内容的提问来源于stack exchange,提问作者Moisés Araujo
相关产品推荐
相关产品推荐

