如何使用Oracle SQL获取FAMILY列中3个指定值的首行数据?
获取指定FAMILY的首行数据
SQL里的表本身没有固定的行顺序,所以得先明确“首行”的判定规则——比如按创建时间最早、ID最小/最大等。下面以取每个指定FAMILY的最早创建日期对应的行为例,给出两种实现方法,你可以根据需求调整排序规则。
方法一:用窗口函数ROW_NUMBER()(推荐,灵活可控)
这是最通用的写法,能精准控制每个组只返回一行:
SELECT ID, FAMILY, ENV_XML_PATH, CREATED_DATE FROM ( SELECT *, -- 按FAMILY分组,组内按创建日期升序排,给每行标序号 ROW_NUMBER() OVER (PARTITION BY FAMILY ORDER BY CREATED_DATE ASC) AS row_num FROM your_table_name -- 替换成你的实际表名 WHERE FAMILY IN ('CRM', 'SCM', 'IC') -- 筛选指定的FAMILY值 ) ranked_data WHERE row_num = 1; -- 只取每个组的第一行
调整规则:
- 如果要按ID最小的行作为“首行”,把
ORDER BY CREATED_DATE ASC改成ORDER BY ID ASC - 如果要最新创建的行,改成
ORDER BY CREATED_DATE DESC
方法二:用子查询+关联查询
适合理解基础SQL逻辑的场景:
SELECT t1.ID, t1.FAMILY, t1.ENV_XML_PATH, t1.CREATED_DATE FROM your_table_name t1 JOIN ( -- 先找出每个指定FAMILY的最早创建日期 SELECT FAMILY, MIN(CREATED_DATE) AS earliest_date FROM your_table_name WHERE FAMILY IN ('CRM', 'SCM', 'IC') GROUP BY FAMILY ) t2 ON t1.FAMILY = t2.FAMILY AND t1.CREATED_DATE = t2.earliest_date;
注意:如果同一个FAMILY有多个行的创建日期完全相同且都是最早,这个写法会返回所有这些行;如果要确保只返回一行,优先用方法一。
内容的提问来源于stack exchange,提问作者bapun
相关产品推荐
相关产品推荐

