Oracle SQL外部查询排序调整:按distinct im.sequence分组排序需求
解决方案:调整排序逻辑实现分组批次排序
当然可以做到!你需要利用Oracle的窗口函数来给每个im.sequence分组内的记录标记行号,然后通过组合行号和原序列值来排序,就能得到你想要的1,2,3,4,2,3,4顺序。
修改后的完整查询
SELECT s.value AS "value" , im.sequence AS "sequence" , lookup_detail_lib.get_type_value_message AS "prefix" , lookup_detail_lib.get_type_value_message AS "suffix" , im.field AS "field" FROM xmltable('for $i in ./ROWSET/ROW/* return $i' passing dbms_xmlgen.getxmltype('SELECT blah blah this generates a clob') columns column_name VARCHAR2(100) path 'local-name()' , VALUE CLOB path 'text()') s , info_metadata im , task t , job j WHERE im.column_name = s.column_name AND im.job_type = j.job_type AND j.job_id = t.job_id AND NVL(im.task_type, t.task_type) = t.task_type AND t.task_id = 13580 ORDER BY -- 按每个sequence分组内的行号排序,行号1的记录优先展示 row_number() OVER (PARTITION BY im.sequence ORDER BY im.sequence), -- 同一行号组内按sequence升序排列 im.sequence;
逻辑说明
这里的核心是row_number() OVER (PARTITION BY im.sequence ORDER BY im.sequence)这个窗口函数:
PARTITION BY im.sequence会把相同sequence值的记录分成独立分组row_number()给每组内的记录分配一个从1开始的递增行号(比如sequence=2的两条记录,行号分别是1和2)
排序时:
- 首先按行号升序,所有行号为1的记录会最先出现,并且按
im.sequence升序排列,得到1,2,3,4 - 然后处理行号为2的记录,同样按
im.sequence升序排列,得到2,3,4
最终结果正好匹配你期望的顺序。如果后续im.sequence分组内出现更多行(比如3条),这个逻辑也能自动扩展,继续按批次展示对应序列值。
内容的提问来源于stack exchange,提问作者M. Doe
相关产品推荐
相关产品推荐

