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
相关产品推荐
相关产品推荐

