oracle怎么查询函数,oracle查询技巧以及函数使用

确定一段数据连续值得开始点和结束点

如下面的nba每年获得总冠军的队伍数据:

0818b9ca8b590ca3270a3433284dd417.png

统计连续获得总冠军的队伍名称,以及年份的开始和结束点

代码如下:

with cte as

(select row_number() over(order by nvl(a.Y, 9999)) id,

a.*,

b.tname t1,

b.Y Y1

from nba a

full join nba b

on a.Y = b.Y + 1

where a.tname <> b.tname)

--select * from cte;

--select * from nba;

select a.tname, a.Y, b.Y1

from cte a, cte b

where a.id = b.id - 1

and a.Y <> b.Y1解析:

with cte as

(select row_number() over(order by nvl(a.Y, 9999)) id,

a.*,

b.tname t1,

b.Y Y1

from nba a

full join nba b

on a.Y = b.Y + 1

where a.tname <> b.tname)

此部分代码得到如下数据:

0818b9ca8b590ca3270a3433284dd417.png

(0)因为原始数据已经按照年份进行排序,

(1)在对数据的操作过程中:可以根据T-1年和T年随对应的队伍名称是否一致来判断是否连续。

(2)代码中用相反的策略,剔除T-1年和T年队伍相同的数据,得到以上数据。

(3)以上数据说明:编号相连两行数据Y和Y1表示了一个队伍连续获得冠军的区间。(此处不需要再考虑这两个的tname和T1相同,以为(2)中说明已经保证一致了)

接下来的处理只需要将这两个时间段取出来就可以了:

select a.tname, a.Y, b.Y1

from cte a, cte b

where a.id = b.id - 1

and a.Y <> b.Y1此部分保证了编号的连续性,并且要判断Y和Y1不相同,相同的话就是一年,并不是连续的几年。

结果如下:

0818b9ca8b590ca3270a3433284dd417.png

在:《oracle查询优化改写技巧与方案》中还有另外一种方法,使用到了聚合函数

0818b9ca8b590ca3270a3433284dd417.png

仅供大家参考。(如有对原著的不合理引用请联系我,并将尽快删除)

-------------------------------------------------------------------------------------------------------------------------------------------

wmsys.wm_concat(column);

此函数根据聚合函数group by的分组策略将同一组的数据以逗号为分隔符,拼接到一行

原始数据

0818b9ca8b590ca3270a3433284dd417.png

select

em.chk_shcema,

replace(wmsys.wm_concat(em.src_table),',','')

from etl_monitor_cfg em

group by chk_shcema

其中 replace函数将逗号替换为空

查询结果:

0818b9ca8b590ca3270a3433284dd417.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值