加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

oracle查询技巧以及函数使用

发布时间:2020-12-12 15:15:39 所属栏目:百科 来源:网络整理
导读:确定一段数据连续值得开始点和结束点 如下面的nba每年获得总冠军的队伍数据: 统计连续获得总冠军的队伍名称,以及年份的开始和结束点 代码如下: 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

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

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


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

代码如下:

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,b.Y Y1
    from nba a
    full join nba b
      on a.Y = b.Y + 1
   where a.tname <> b.tname)

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


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

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

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

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

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

select a.tname,cte b
 where a.id = b.id - 1
   and a.Y <> b.Y1
此部分保证了编号的连续性,并且要判断Y和Y1不相同,相同的话就是一年,并不是连续的几年。
结果如下:


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


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


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

wmsys.wm_concat(column);


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

原始数据


select 
em.chk_shcema,replace(wmsys.wm_concat(em.src_table),','')
from etl_monitor_cfg em
group by chk_shcema

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

查询结果:

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读