oracle查看执行计划:
1:EXPLAIN PLAN for 要执行的sql
2:select * from table (dbms_xplan.display);
1:wm_concat()函数
会将分组内的多条数据的指定字段通过,拼接填充至一个指定字段
eg:表test_table如下:
x | y | z | c |
---|---|---|---|
x1 | y1 | z1 | c |
x2 | y2 | z2 | c |
x3 | y3 | z3 | c |
SELECT wm_concat(x) joinx,
wm_concat(y) joiny,
wm_concat(z) joinz,
c
from test_table group by c
上述sql查询后查询结果如下:
joinx | joiny | joinz | c |
---|---|---|---|
x1,x2,x3 | y1,y2,y3 | z1,z2,z3 | c |
2:row_number()
ROW_NUMBER 是一个解析函数。它为应用它的每一行(分区中的每一行或查询返回的每一行)分配一个唯一编号,在 order_by_clause 中指定的有序行序列中,从 1 开始。
通过在检索指定范围的 ROW_NUMBER 值的查询中嵌套使用 ROW_NUMBER 的子查询,您可以从内部查询的结果中找到精确的行子集。该函数的这种使用使您可以实现 top-N、bottom-N 和 inner-N 报告。为了获得一致的结果,查询必须确保确定的排序顺序。
您不能使用 ROW_NUMBER 或 expr 的任何其他分析函数来嵌套分析函数。但是,您可以为 expr 使用其他内置函数表达式。有关有效形式的 expr 的信息,请参阅“关于 SQL 表达式”.
eg: 从emp_info中查询出每个员工钱最多的那条记录的信息
select *
from (select (row_number() over (partition by user_id order by money desc)) rd, a.*
from emp_info a)
where rd = 1;
3: rank()
rank函数用于返回结果集的分区内每行的排名,行的排名是相关行之前的排名数加一。rank与row_number函数不同的是,rank函数考虑到over子句中排序字段值相同的情况,over子句中排序字段值相同的序号是一样的,后面字段值不相同的序号将跳过相同的排名号排下一个,也就是相关行之前的排名数加一,可以理解为根据当前的记录数生成序号,后面的记录依此类推。
类似与row_number()函数只不过这边的结果会出现同号类似于排名。如1,2,2,4。而DENSE_RANK()函数则不会跳过,结果类似于1,2,2,3