楼主: lastwinner

[精华] Oracle层次查询和分析函数在号段选取中的应用

[复制链接]
论坛徽章:
33
劳斯莱斯
日期:2013-08-08 14:01:23三菱
日期:2013-09-28 10:16:06一汽
日期:2013-11-19 17:01:11凯迪拉克
日期:2013-12-07 17:11:282014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02itpub13周年纪念徽章
日期:2014-09-27 14:20:21itpub13周年纪念徽章
日期:2014-10-08 15:13:38懒羊羊
日期:2015-03-04 14:52:112015年新春福章
日期:2015-03-06 11:58:18
发表于 2008-1-3 11:21 | 显示全部楼层

下了,学习中,谢谢

使用道具 举报

回复
论坛徽章:
29
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:442010广州亚运会纪念徽章:现代五项
日期:2011-04-23 11:54:412011新春纪念徽章
日期:2011-02-18 11:43:342010广州亚运会纪念徽章:轮滑
日期:2010-10-30 23:51:492010新春纪念徽章
日期:2010-01-04 08:33:08祖国60周年纪念徽章
日期:2009-10-09 08:28:00ITPUB8周年纪念徽章
日期:2009-09-27 10:21:212009日食纪念
日期:2009-07-22 09:30:00NBA季后赛纪念徽章
日期:2008-06-20 11:45:19NBA常规赛纪念章
日期:2008-04-18 19:48:16
发表于 2008-1-3 16:44 | 显示全部楼层
好帖常來讀,收藏!謝謝LZ的分享!

使用道具 举报

回复
论坛徽章:
0
发表于 2008-1-3 18:52 | 显示全部楼层
學習

使用道具 举报

回复
招聘 : 系统分析师
论坛徽章:
483
马上有钱
日期:2014-02-19 11:55:14itpub13周年纪念徽章
日期:2014-09-29 01:14:14itpub13周年纪念徽章
日期:2014-10-08 15:15:25itpub13周年纪念徽章
日期:2014-10-08 15:15:25马上有对象
日期:2014-10-12 11:58:40马上有车
日期:2014-11-16 17:11:29慢羊羊
日期:2015-02-09 17:04:38沸羊羊
日期:2015-03-04 14:43:432015年新春福章
日期:2015-03-06 11:57:31ITPUB年度最佳版主
日期:2015-03-18 15:48:48
 楼主| 发表于 2008-1-27 18:25 | 显示全部楼层
原帖由 grubbyoo 于 07-12-4 12:25 发表
3.1.1        题例
我有一个表结构,
fphm,kshm
2014,00000001
2014,00000002
2014,00000003
2014,00000004
2014,00000005
2014,00000007
2014,00000008
2014,00000009
2013,00000120
2013,00000121
2013,00000122
2013,00000124
2013,00000125

(第二个字段内可能是连续的数据,可能存在断点。)

怎样能查询出来这样的结果,查询出连续的记录来。
就像下面的这样?
2014,00000001,00000005
2014,00000009,00000007
2013,00000120,00000122
2013,00000124,00000125


可以这样写



select max(fphm),min(kshm),max(kshm)
from test
group by fphm||khsm-rownum




写法太简洁了!

思路和这个一样,很巧妙
原帖由 hmxxyy 于 05-4-30 00:54 发表
还真引出玉来了

SQL> select b.fphm,min(b.kshm),max(b.kshm)
  2  from (
  3          select a.*,to_number(a.kshm-rownum) cc
  4          from (
  5                  select * from t order by fphm,kshm
  6          ) a
  7  )  b
  8  group by b.fphm,b.cc
  9  /

引自http://blog.itpub.net/post/5042/27936

绝!

使用道具 举报

回复
论坛徽章:
30
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44ITPUB元老
日期:2008-11-06 08:17:37数据库板块每日发贴之星
日期:2008-08-21 01:02:42NBA常规赛纪念章
日期:2008-04-18 19:48:162008新春纪念徽章
日期:2008-02-13 12:43:03数据库板块每日发贴之星
日期:2008-02-13 01:04:46数据库板块每日发贴之星
日期:2008-02-10 01:03:46数据库板块每日发贴之星
日期:2008-02-08 01:04:31数据库板块每日发贴之星
日期:2008-02-06 01:05:09祖国60周年纪念徽章
日期:2009-10-09 08:28:00
发表于 2008-2-7 11:40 | 显示全部楼层
好东西,收藏了。

使用道具 举报

回复
论坛徽章:
3
2009日食纪念
日期:2009-07-22 09:30:002010年世界杯参赛球队:法国
日期:2010-05-11 10:38:442010广州亚运会纪念徽章:高尔夫球
日期:2011-05-04 11:20:40
发表于 2008-3-21 17:30 | 显示全部楼层
留个记号

使用道具 举报

回复
论坛徽章:
2
八级虎吧徽章
日期:2008-12-24 12:00:59CTO参与奖
日期:2009-01-15 11:42:46
发表于 2008-11-28 09:17 | 显示全部楼层
maek it for study

使用道具 举报

回复
求职 : 信息技术经理/主管
论坛徽章:
24
授权会员
日期:2008-02-29 10:00:41秀才
日期:2016-01-25 14:55:31秀才
日期:2016-01-13 12:14:26紫蜘蛛
日期:2014-11-05 16:43:53ITPUB社区12周年站庆徽章
日期:2013-10-08 17:44:42ITPUB社区12周年站庆徽章
日期:2013-10-08 14:57:28ITPUB社区12周年站庆徽章
日期:2013-10-08 14:54:39红旗
日期:2013-09-05 15:55:56鲜花蛋
日期:2013-03-03 22:23:072013年新春福章
日期:2013-02-25 14:51:24
发表于 2008-11-28 09:40 | 显示全部楼层
不错,学习了,支持了!

使用道具 举报

回复
论坛徽章:
30
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:442012新春纪念徽章
日期:2012-01-04 11:49:54茶鸡蛋
日期:2012-04-19 11:02:10奥运会纪念徽章:棒球
日期:2012-06-19 17:41:27ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07复活蛋
日期:2013-01-15 10:40:032013年新春福章
日期:2013-02-25 14:51:24咸鸭蛋
日期:2013-02-28 10:06:50蛋疼蛋
日期:2013-03-20 13:55:26劳斯莱斯
日期:2013-08-04 11:17:23
发表于 2010-7-8 14:07 | 显示全部楼层
mark 一下

使用道具 举报

回复
论坛徽章:
6
ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512010广州亚运会纪念徽章:曲棍球
日期:2010-12-06 10:59:282011新春纪念徽章
日期:2011-02-18 11:43:34双黄蛋
日期:2011-07-15 10:33:56灰彻蛋
日期:2011-08-15 16:23:02ITPUB十周年纪念徽章
日期:2011-11-01 16:25:51
发表于 2010-7-15 15:28 | 显示全部楼层

回复 #1 lastwinner 的帖子

3.1.1        题例
我有一个表结构,
fphm,kshm
2014,00000001
2014,00000002
2014,00000003
2014,00000004
2014,00000005
2014,00000007
2014,00000008
2014,00000009
2013,00000120
2013,00000121
2013,00000122
2013,00000124
2013,00000125

(第二个字段内可能是连续的数据,可能存在断点。)

怎样能查询出来这样的结果,查询出连续的记录来。
就像下面的这样?
2014,00000001,00000005
2014,00000009,00000007
2013,00000120,00000122
2013,00000124,00000125

3.1.2        解答
思路:利用lag取得前一行的kshm,然后和本行的kshm想比,如果差值为1,说明这一行和上一行是连续的。由于首尾的特殊性,故而需要先用max和min来获得首尾点。
PHP code:--------------------------------------------------------------------------------
select fphm, nvl(lag(e)over(partition by fphm order by s),minn) ST, nvl(S,maxn) EN from
(select fphm, lag(kshm,1) over(partition by fphm order by kshm) S, kshm E,
min(kshm)over(partition by fphm) minn, max(kshm) over(partition by fphm) maxn from t)
where nvl(E-S-1,1)<>0;

FPHM       ST         EN
---------- ---------- ----------
2013       00000120   00000122
2013       00000124   00000125
2014       00000001   00000005
2014       00000007   00000009

-------------------------
我的写法:
create table test_3 ( fphm varchar2(10),kshm varchar2(10));
insert into test_3 values ('2014','00000001');
insert into test_3 values ('2014','00000002');
insert into test_3 values ('2014','00000003');
insert into test_3 values ('2014','00000004');
insert into test_3 values ('2014','00000005');
insert into test_3 values ('2014','00000007');
insert into test_3 values ('2014','00000008');
insert into test_3 values ('2014','00000009');
insert into test_3 values ('2013','00000120');
insert into test_3 values ('2013','00000121');
insert into test_3 values ('2013','00000122');
insert into test_3 values ('2013','00000124');
insert into test_3 values ('2013','00000125');
commit;
---------
SELECT fphm,MIN(kshm) ,MAX(kshm) FROM test_3  GROUP BY fphm,kshm-ROWNUM;

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表