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

求助:如何将查询最年轻/最年长员工的语句改为使用rank()?

使用RANK()窗口函数替代MIN/MAX子查询实现需求

原代码通过MIN(DOB)和MAX(DOB)结合UNION ALL筛选出出生日期最早和最晚的员工,下面是用RANK()窗口函数实现相同逻辑的正确写法,同时规避常见语法错误:

完整可运行代码

ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY';

CREATE TABLE EMPLOYEES 
(EMPLOYEE_ID, FIRST_NAME, LAST_NAME, DOB) AS 
SELECT 1, 'John', 'Doe', DATE '2002-06-01'
 FROM DUAL UNION ALL 
SELECT 2, 'Jane', 'Doe', DATE '2002-08-09'
 FROM DUAL UNION ALL 
SELECT 3, 'Mike', 'Jones', DATE '2000-08-09'
 FROM DUAL; 

-- 基于RANK()窗口函数的查询语句
SELECT EMPLOYEE_ID, FIRST_NAME, LAST_NAME, DOB
FROM (
    SELECT 
        e.*,
        -- 按出生日期升序排名,最早的日期排名为1
        RANK() OVER (ORDER BY DOB ASC) AS min_dob_rank,
        -- 按出生日期降序排名,最晚的日期排名为1
        RANK() OVER (ORDER BY DOB DESC) AS max_dob_rank
    FROM EMPLOYEES e
) ranked_emps
WHERE min_dob_rank = 1 OR max_dob_rank = 1;

关键注意事项

  1. 窗口函数不可直接用于WHERE子句:这是最容易触发语法错误的点。窗口函数的计算逻辑在WHERE筛选之后执行,因此必须先将排名计算放在子查询或CTE中,再在外层筛选排名条件。
  2. RANK()的特性:RANK()会为相同出生日期的员工分配相同排名,确保如果有多个员工共享最早/最晚出生日期,所有匹配记录都会被返回(和原代码的IN逻辑完全一致)。若无需保留同排名的重复记录,可改用ROW_NUMBER(),但需注意它会为同日期的员工随机分配唯一排名。
  3. OVER子句必须指定排序规则:窗口函数依赖排序逻辑确定排名顺序,这里通过ORDER BY DOB ASC和DESC分别定位最早、最晚的出生日期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 07:02:46