Oracle中如何按优先级分组并筛选最高优先级数据?
返回自定义优先级最高的单行结果
方法1:通过CASE定义优先级 + ORDER BY + LIMIT
把你的双内连接查询作为子查询,用CASE语句给每个状态分配优先级,再按优先级升序排序后取第一行:
SELECT t.* FROM ( -- 替换成你原本的双内连接查询 SELECT 你的字段1, 你的字段2, 状态字段 AS status, CASE 状态字段 WHEN 'C' THEN 1 WHEN 'P' THEN 2 WHEN 'R' THEN 3 WHEN 'F' THEN 4 WHEN 'Q' THEN 5 ELSE 6 -- 其他未定义状态优先级最低 END AS priority FROM 表1 JOIN 表2 ON 表1.关联字段 = 表2.关联字段 JOIN 表3 ON 表1.关联字段 = 表3.关联字段 ) t ORDER BY t.priority ASC LIMIT 1;
如果结果集中存在CONFIRM("C")的行,这条语句会直接返回它;如果没有,则返回下一个优先级的行。
方法2:使用窗口函数ROW_NUMBER()(适合多分组场景)
如果需要按某个字段分组,每组取最高优先级的行,或者单纯要更灵活的排序逻辑,可以用窗口函数:
SELECT 你的字段1, 你的字段2, 状态字段 FROM ( SELECT 你的字段1, 你的字段2, 状态字段, ROW_NUMBER() OVER ( -- 若需分组则添加 PARTITION BY 分组字段 ORDER BY CASE 状态字段 WHEN 'C' THEN 1 WHEN 'P' THEN 2 WHEN 'R' THEN 3 WHEN 'F' THEN 4 WHEN 'Q' THEN 5 ELSE 6 END ASC ) AS row_num FROM 表1 JOIN 表2 ON 表1.关联字段 = 表2.关联字段 JOIN 表3 ON 表1.关联字段 = 表3.关联字段 ) t WHERE t.row_num = 1;
窗口函数会给每行按优先级排序标记序号,筛选序号为1的行就是优先级最高的结果。
内容的提问来源于stack exchange,提问作者Felipe Castillo
相关产品推荐
相关产品推荐

