Oracle SQL查询:找出首份职业为记者的人员姓名
解决思路与Oracle SQL语句
要找出所有首份职业为Journalist的人员姓名,核心是定位每个人最早入职的那项职业,再筛选出职业是记者的记录。这里提供两种实用的Oracle SQL写法:
方法一:使用窗口函数(推荐,逻辑清晰)
窗口函数可以轻松给每个人的职业按入职时间排序,直接取第一条记录判断职业:
WITH ranked_occupations AS ( SELECT Name, Occupation, -- 按姓名分组,入职日期升序排序,最早的职业排第1 ROW_NUMBER() OVER (PARTITION BY Name ORDER BY Startdate ASC) AS job_order FROM your_table_name -- 替换成你的实际表名 ) SELECT DISTINCT Name FROM ranked_occupations WHERE job_order = 1 AND Occupation = 'Journalist';
逻辑说明:
ROW_NUMBER() OVER (PARTITION BY Name ORDER BY Startdate ASC):给每个用户的职业记录按入职时间从早到晚编号,最早的职业编号为1。- 筛选编号为1且职业是
Journalist的记录,用DISTINCT确保姓名不重复(即使同一人有多条最早入职的记录,不过通常入职日期唯一)。
方法二:使用子查询+分组关联
先通过分组找到每个人的最早入职日期,再关联原表找到对应职业:
SELECT DISTINCT t.Name FROM your_table_name t INNER JOIN ( -- 分组获取每个人的最早入职日期 SELECT Name, MIN(Startdate) AS first_start_date FROM your_table_name GROUP BY Name ) earliest_jobs ON t.Name = earliest_jobs.Name AND t.Startdate = earliest_jobs.first_start_date WHERE t.Occupation = 'Journalist';
逻辑说明:
- 子查询
earliest_jobs先按姓名分组,用MIN(Startdate)拿到每个人的最早入职日期。 - 将原表和子查询关联,找到对应最早日期的职业记录,再筛选职业为
Journalist的姓名。
两种方法都能满足需求,窗口函数的写法更简洁易读,适合大多数场景~
内容的提问来源于stack exchange,提问作者SomebodyWithAQuestion
相关产品推荐
相关产品推荐

