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

PostgreSQL:如何编写两类员工数据查询的SQL语句

两个SQL查询问题的解决方案

基于你提供的employee表结构,针对两个问题的正确解法如下:

问题1:返回每个部门中第10位最资深员工的id

首先明确:这里默认以出生日期birth_dt判断资历(出生日期越早,年龄越大,视为越资深)。你之前的尝试存在逻辑偏差:

  • 按birth_dt分组无法实现按部门统计的需求
  • LIMIT 10 OFFSET 9是全局筛选,不是每个部门内取第10条记录

正确实现需要用窗口函数ROW_NUMBER(),按部门分组后给员工按资历排序编号,再筛选出编号为10的员工:

SELECT id
FROM (
    SELECT 
        id,
        department_id,
        -- 按部门分组,出生日期升序排序(最资深排前),生成资历排名
        ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY birth_dt ASC) AS seniority_rank
    FROM employee
) ranked_employees
WHERE seniority_rank = 10;

如果部门内存在出生日期相同的员工,可添加辅助排序字段(比如id)避免排名歧义:ORDER BY birth_dt ASC, id ASC。

问题2:返回比其主管年长的员工的id

主管指同一部门内chief_flg = true的员工。你之前的尝试存在别名重复、未定义关联表别名的问题,逻辑不成立。

正确做法是通过自连接关联员工与同部门主管,再比较出生日期:

SELECT emp.id
FROM employee emp
JOIN employee chief 
    ON emp.department_id = chief.department_id 
    AND chief.chief_flg = true
-- 员工出生日期更早(年龄更大)
WHERE emp.birth_dt < chief.birth_dt;

若部门存在多位主管,上述查询会返回比任意一位主管年长的员工。如果需要员工比部门内所有主管都年长,可修改条件为:

SELECT emp.id
FROM employee emp
WHERE emp.birth_dt < ALL (
    SELECT birth_dt 
    FROM employee 
    WHERE department_id = emp.department_id AND chief_flg = true
);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 09:12:49