楼主: lastwinner

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

[复制链接]
论坛徽章:
24
生肖徽章:狗
日期:2006-09-07 10:14:43数据库板块每日发贴之星
日期:2008-07-26 01:02:20生肖徽章2007版:兔
日期:2008-10-13 11:10:11奥运会纪念徽章:铁人三项
日期:2008-10-24 13:27:21开发板块每日发贴之星
日期:2008-12-27 01:01:09生肖徽章2007版:马
日期:2009-11-18 10:45:032010新春纪念徽章
日期:2010-03-01 11:21:02ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51ERP板块每日发贴之星
日期:2011-05-18 01:01:01ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15
发表于 2007-5-25 17:20 | 显示全部楼层
先声明下,我不是找毛病的。因为目前打算用才认真研究了一下。

可是LZ总结的在实际使用中不能直接用啊,能否帮忙想想这个。

Insert into T8(A, B, C, Q)Values(1001, 1999, 1, 'A');

SQL> select S,E from
  2  (
  3  SELECT NVL2(LAG(A)OVER(PARTITION BY Q ORDER BY A), B+1, MIN(A)OVER(PARTITION BY Q)) S,
  4  NVL(LEAD(A)OVER(PARTITION BY Q ORDER BY A)-1, MAX(B)OVER(PARTITION BY Q)) E
  5  from t8 START WITH C=1 CONNECT BY C-1 = PRIOR C AND Q= PRIOR Q
  6  )
  7  where s<=e
  8  /

         S          E
---------- ----------
        51         99
       200        299
       500        554
       667       1000

在用上面的语句并不能正确显示了 。

怎么解决!

使用道具 举报

回复
认证徽章
论坛徽章:
15
授权会员
日期:2006-03-21 15:51:46会员2007贡献徽章
日期:2007-09-26 18:42:10数据库板块每日发贴之星
日期:2007-06-16 01:03:50数据库板块每日发贴之星
日期:2007-06-01 01:02:53ERP板块每日发贴之星
日期:2007-05-29 01:02:28数据库板块每日发贴之星
日期:2007-05-28 01:01:49行业板块每日发贴之星
日期:2007-05-23 01:04:05设计板块每日发贴之星
日期:2007-05-20 01:04:04数据库板块每日发贴之星
日期:2007-05-16 01:02:34ERP板块每日发贴之星
日期:2007-05-14 01:02:30
发表于 2007-5-25 22:34 | 显示全部楼层
一定好好的学习一下,谢谢分享。

使用道具 举报

回复
论坛徽章:
7
授权会员
日期:2007-07-24 13:58:32ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44生肖徽章2007版:鸡
日期:2008-01-02 17:35:53生肖徽章2007版:猴
日期:2008-01-02 17:35:53生肖徽章2007版:兔
日期:2008-01-02 17:35:53生肖徽章2007版:虎
日期:2008-01-02 17:35:53生肖徽章2007版:鼠
日期:2008-01-02 17:35:53
发表于 2007-6-3 19:22 | 显示全部楼层
学习了

使用道具 举报

回复
论坛徽章:
0
发表于 2007-9-6 16:56 | 显示全部楼层
好帖,学习下

使用道具 举报

回复
论坛徽章:
273
生肖徽章2007版:猪
日期:2008-09-27 09:35:45明尼苏达森林狼
日期:2009-01-12 14:15:09生肖徽章2007版:猪
日期:2009-01-21 16:30:59布鲁克林篮网
日期:2009-03-03 14:42:32圣安东尼奥马刺
日期:2009-03-03 14:44:41生肖徽章2007版:鸡
日期:2009-03-03 21:45:52生肖徽章2007版:牛
日期:2009-03-09 14:03:42生肖徽章2007版:猪
日期:2009-03-10 21:37:00生肖徽章2007版:羊
日期:2009-03-16 10:17:11生肖徽章2007版:虎
日期:2009-03-24 21:26:52
发表于 2007-9-9 10:07 | 显示全部楼层
受教了

使用道具 举报

回复
认证徽章
论坛徽章:
15
授权会员
日期:2009-04-13 17:01:142010新春纪念徽章
日期:2010-01-04 08:33:082010新春纪念徽章
日期:2010-03-01 11:04:59ITPUB元老
日期:2010-11-30 19:08:482011新春纪念徽章
日期:2011-01-04 10:24:02生肖徽章2007版:兔
日期:2011-01-20 12:58:49ITPUB十周年纪念徽章
日期:2011-11-01 16:24:04
发表于 2007-12-1 08:51 | 显示全部楼层
收藏了 好帖  学习学习在学习  支持楼主!!!!

使用道具 举报

回复
论坛徽章:
40
开发板块每日发贴之星
日期:2005-03-24 01:02:092009日食纪念
日期:2009-07-22 09:30:00欧洲冠军杯纪念徽章
日期:2009-05-31 09:59:59NBA常规赛纪念章
日期:2009-04-16 14:28:42指数菠菜纪念章
日期:2009-04-01 10:07:11指数菠菜纪念章
日期:2009-01-06 12:20:54股神
日期:2009-01-06 11:59:192009新春纪念徽章
日期:2009-01-04 14:52:282009新春纪念徽章
日期:2009-01-04 14:52:282009日食纪念
日期:2009-07-22 09:30:00
发表于 2007-12-1 12: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
 楼主| 发表于 2007-12-2 04:38 | 显示全部楼层
原帖由 hanjs 于 07-5-25 17:20 发表
先声明下,我不是找毛病的。因为目前打算用才认真研究了一下。

可是LZ总结的在实际使用中不能直接用啊,能否帮忙想想这个。

Insert into T8(A, B, C, Q)Values(1001, 1999, 1, 'A');

SQL> select S,E from
  2  (
  3  SELECT NVL2(LAG(A)OVER(PARTITION BY Q ORDER BY A), B+1, MIN(A)OVER(PARTITION BY Q)) S,
  4  NVL(LEAD(A)OVER(PARTITION BY Q ORDER BY A)-1, MAX(B)OVER(PARTITION BY Q)) E
  5  from t8 START WITH C=1 CONNECT BY C-1 = PRIOR C AND Q= PRIOR Q
  6  )
  7  where s<=e
  8  /

         S          E
---------- ----------
        51         99
       200        299
       500        554
       667       1000

在用上面的语句并不能正确显示了 。

怎么解决!


列Q是用来分组的标准
这样:
Insert into T8(A, B, C, Q)Values(1001, 1999, 1, 'B');

[php]
SQL> select S,E from
  2  (
  3  SELECT NVL2(LAG(A)OVER(PARTITION BY Q ORDER BY A), B+1, MIN(A)OVER(PARTITION BY Q)) S,
  4  NVL(LEAD(A)OVER(PARTITION BY Q ORDER BY A)-1, MAX(B)OVER(PARTITION BY Q)) E
  5  from t8 START WITH C=1 CONNECT BY C-1 = PRIOR C AND Q= PRIOR Q
  6  )
  7  where s<=e
  8  /
         S          E
---------- ----------
         0         99
       200        299
       500        554
       667       1000
      1001       1999

...............
[/php]

现在才看到,估计已经帮不上你了

使用道具 举报

回复
论坛徽章:
21
红旗
日期:2013-09-30 15:26:01凯迪拉克
日期:2013-10-23 12:48:26比亚迪
日期:2013-11-01 09:19:01奔驰
日期:2013-12-13 09:27:30马上有对象
日期:2014-11-18 10:46:242015年新春福章
日期:2015-04-28 15:24:55慢羊羊
日期:2015-05-28 09:49:31
发表于 2007-12-4 11:59 | 显示全部楼层
嘿嘿,复习了

使用道具 举报

回复
论坛徽章:
21
红旗
日期:2013-09-30 15:26:01凯迪拉克
日期:2013-10-23 12:48:26比亚迪
日期:2013-11-01 09:19:01奔驰
日期:2013-12-13 09:27:30马上有对象
日期:2014-11-18 10:46:242015年新春福章
日期:2015-04-28 15:24:55慢羊羊
日期:2015-05-28 09:49:31
发表于 2007-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

使用道具 举报

回复

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

本版积分规则 发表回复

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