这几天又学了几个oracle函数

前几天,涉及到一个业务,就是分组之后,将每个组内的字符串以空格分割拼接起来输出。
举个例子如下:
表结构
exa
A VARCHAR2(2) Y
B VARCHAR2(11) Y

表数据
        A       B
a 1
a 2
a 3
b 4
b 5

输出结果如下
a    1,2,3
b    4,5
如果用oracle10g 或以上的话,可以分组后直接用wmsys.wm_concat函数得到结果;
如果是mysql 可以分组后用group_concat函数来得到结果;
如果是10g以下的用等级查询,外加SYS_CONNECT_BY_PATH 函数(有点复杂);

select
t.a,
ltrim(max(sys_connect_by_path(t.b,' ')),' ') res
from
(
select e.a,e.b
row_number() over(partition by e.a order by e.a) rn,
( row_number() over(order by null)+dense_rank() over(order by e.a) ) num
from exa e
) t
start with t.rn=1 connect by prior num - 1 = num
group by t.a

用到了dense_rank,和 row_number 函数,
区别就是 row_number 是 1,2,3,4,5   不会有重复的数字,也不会跳跃
         dense_rank 是 1,1,1,2,2,3,3,3,4  有重复的数字,但不会跳跃
         rank 是  1,1,1,4,4,6,6,6,9  有重复的数字,也会跳跃,但是有规律
但是测验了下,区别还有 就是 row_number函数和后面的over 里的order没关系,只和partition有关系,dense_rank和rank都会被partition、order影响。

另外 lead函数
select t.a,lead(t.b,1) over (order by t.a) rs from exa t
结果
       A       B       rs
1 a 1 2
2 a 2 3
3 a 3 4
4 b 4 5
5 b 5


你可能感兴趣的:(数据结构,oracle,mysql)