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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 20:09:11