oracle查询技巧以及函数使用
2017-03-15 19:25
246 查看
确定一段数据连续值得开始点和结束点
如下面的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
or a.team is null
or b.team is null)
--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
解析:
此部分代码得到如下数据:
(0)因为原始数据已经按照年份进行排序,
(1)在对数据的操作过程中:可以根据T-1年和T年随对应的队伍名称是否一致来判断是否连续。
(2)代码中用相反的策略,剔除T-1年和T年队伍相同的数据,得到以上数据。
(3)以上数据说明:编号相连两行数据Y和Y1表示了一个队伍连续获得冠军的区间。(此处不需要再考虑这两个的tname和T1相同,以为(2)中说明已经保证一致了)
接下来的处理只需要将这两个时间段取出来就可以了:
此部分保证了编号的连续性,并且要判断Y和Y1不相同,相同的话就是一年,并不是连续的几年。
结果如下:
在:《oracle查询优化改写技巧与方案》中还有另外一种方法,使用到了聚合函数
仅供大家参考。(如有对原著的不合理引用请联系我,并将尽快删除)
-------------------------------------------------------------------------------------------------------------------------------------------
wmsys.wm_concat(column);
此函数根据聚合函数group by的分组策略将同一组的数据以逗号为分隔符,拼接到一行
原始数据
其中 replace函数将逗号替换为空
查询结果:
如下面的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
or a.team is null
or b.team is null)
--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 or a.team is null or b.team is null) //此处添加为应对如果数据中第1,2年,和最后两年是一个队伍连续获奖被剔除的可能。
此部分代码得到如下数据:
(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不相同,相同的话就是一年,并不是连续的几年。
结果如下:
在:《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函数将逗号替换为空
查询结果:
相关文章推荐
- oracle 开窗函数的使用,表的外关联,子查询的封装以及where使用的注意事项
- Oracle在查询中使用函数
- Oracle查询以及函数
- Oracle中Decode()函数使用技巧
- Oracle中Decode()函数使用技巧
- Oracle-oracleSQL对单表各种查询操作及函数的使用
- 数据库SQL中对查询结果排序排列序号编号,Oracle分析函数 rank,dense_rank,row_number使用和区别
- oracle错误号大全(查询ora错误号以及解决方法技巧)
- 使用Oracle 分析函数RANK()实现查询库存中每类物资最新N条记录
- Oracle 字符串查询以及拆分函数
- Oracle中Decode()函数使用技巧
- Oracle列转行函数Listagg以及pivot查询示例
- Oracle模糊查询之(3.1从使用函数和sql语法角度来提高模糊查询效率 一)oracle模糊查询效率提高
- Oracle使用技巧之分析函数篇
- ORACLE case when 函数的使用技巧
- oracle 之在查询中使用函数
- Oracle中Decode()函数使用技巧
- 关于oracle和sqlserver中创建uuid的方法以及级联查询的使用
- Oracle中Decode()函数使用技巧
- 使用connect by进行级联查询(oracle函数)