这几天又学了几个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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值