ITPUB??ì3
2010数据库技术大会
ITPUB论坛 » Oracle开发 » 如何sql查询出连续号码段


您有 2 条公共消息
  • 来自: 公共消息 标题: ITPUB邮箱已经恢复 内容: ITPUB邮箱用户请注意,邮箱现在已经恢复 web访问地址 http://emai ...
  • 来自: 公共消息 标题: 3-5月ITPUB数据库 ... 内容: ITPUB与3月和5月分别安排了Oracle 11g DBA和Oracle性能优化培训,以及 ...

    标题: [精华] 如何sql查询出连续号码段
    离线 reborn
    一般会员



    精华贴数 1
    个人空间 0
    技术积分 447 (5210)
    社区积分 6 (16881)
    注册日期 2001-12-13
    论坛徽章:2
    CTO参与奖授权会员    
          

    发表于 2005-4-26 16:16 
    如何sql查询出连续号码段

    问题求助,请高手指点..

    我有一个表结构,
    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


    只看该作者    顶部
    离线 我菜故我在
    初级会员



    精华贴数 0
    个人空间 0
    技术积分 52 (31554)
    社区积分 0 (209711)
    注册日期 2004-11-3
    论坛徽章:0
          
          

    发表于 2005-4-26 17:04 
    只用一个sql语句我也写不出来这个结果,如果写个过程还行
    期待高手的答案


    __________________
    为什么老是说我不是一个有效的thread,nnd,什么破论坛
    只看该作者    顶部
    离线 hmxxyy
    高级会员


    精华贴数 2
    个人空间 0
    技术积分 2381 (818)
    社区积分 19 (9556)
    注册日期 2004-9-17
    论坛徽章:5
    会员2006贡献徽章授权会员ITPUB新首页上线纪念徽章数据库板块每日发贴之星数据库板块每日发贴之星 
          

    发表于 2005-4-26 19:28 
    这个有意思,容我仔细想一想。


    __________________
    http://hmxxyy.itpub.net只听胡琴声缠绵宛转,却是一曲《凤求凰》...
    只看该作者    顶部
    离线 hmxxyy
    高级会员


    精华贴数 2
    个人空间 0
    技术积分 2381 (818)
    社区积分 19 (9556)
    注册日期 2004-9-17
    论坛徽章:5
    会员2006贡献徽章授权会员ITPUB新首页上线纪念徽章数据库板块每日发贴之星数据库板块每日发贴之星 
          

    发表于 2005-4-26 19:55 
    抛一块砖

    SQL> select * from gap;

            ID        SEQ
    ---------- ----------
             1          1
             1          4
             1          5
             1          8
             2          1
             2          2
             2          9

    select res1.id, res2.seq str, res1.seq end
    from
    (select rownum rn, c.* from (select * from gap a where not exists (select null from gap b where b.id = a.id and a.seq = b.seq - 1) order by id, seq) c ) res1,
    (select rownum rn, d.* from (select * from gap a where not exists (select null from gap b where b.id = a.id and a.seq = b.seq + 1) order by id, seq) d ) res2
    where res1.id = res2.id
      and res1.rn = res2.rn
    /

           ID        STR        END
    --------- ---------- ----------
            1          1          1
            1          4          5
            1          8          8
            2          1          2
            2          9          9


    __________________
    http://hmxxyy.itpub.net只听胡琴声缠绵宛转,却是一曲《凤求凰》...
    只看该作者    顶部
    离线 jametong



    精华贴数 0
    个人空间 0
    技术积分 3755 (468)
    社区积分 43 (6467)
    注册日期 2004-7-22
    论坛徽章:7
    管理团队成员2010新春纪念徽章    
          

    发表于 2005-4-26 22:35 


    SQL> select fphm,lpad(kshm,8,'0') kshm
      2  from t
      3  /

          FPHM KSHM                                                                 
    ---------- ----------------                                                     
          2014 00000001                                                            
          2014 00000002                                                            
          2014 00000003                                                            
          2014 00000004                                                            
          2014 00000005                                                            
          2014 00000007                                                            
          2014 00000008                                                            
          2014 00000009                                                            
          2013 00000120                                                            
          2013 00000121                                                            
          2013 00000122                                                            

          FPHM KSHM                                                                 
    ---------- ----------------                                                     
          2013 00000124                                                            
          2013 00000125                                                            

    13 rows selected.

    SQL> set echo on
    SQL> @bbb.sql
    SQL> select fphm,lpad(kshm,8,'0') start_kshm,lpad(prev_prev_kshm,8,'0') end_kshm
      2  from (
      3    select fphm,kshm,next_kshm,prev_kshm,
      4           lag(kshm,1,null) over (partition by fphm order by kshm )next_next_kshm,
      5           lead(kshm,1,null) over (partition by fphm order by kshm ) prev_prev_kshm
      6    from (
      7           select *
      8           from (
      9             select fphm,kshm,
    10               lead(kshm,1,null) over (partition by fphm order by kshm) next_kshm,
    11               lag(kshm,1,null) over (partition by fphm order by kshm) prev_kshm
    12             from t
    13           )
    14           where ( next_kshm - kshm <> 1 or kshm - prev_kshm <> 1 )
    15           or ( next_kshm is null or prev_kshm is null )
    16    )
    17  )
    18  where next_kshm - kshm = 1
    19  /

          FPHM START_KSHM       END_KSHM                                            
    ---------- ---------------- ----------------                                    
          2013 00000120         00000122                                            
          2013 00000124         00000125                                            
          2014 00000001         00000005                                            
          2014 00000007         00000009                                            

    SQL> spool off




    __________________
    Work@hangzhou
    jametong at gmail dot com
    http://www.dbthink.com
    订阅到GoogleReader
    订阅我的Blog
    只看该作者    顶部
    离线 longwansheng
    资深会员


    来自 廣東深圳
    精华贴数 0
    个人空间 0
    技术积分 1618 (1297)
    社区积分 5 (19074)
    注册日期 2004-7-17
    论坛徽章:1
    BLOG每日发帖之星     
          

    发表于 2005-4-27 11:10 
    UP,
    又學了一點.


    __________________
    在oracle erp維護與分析開發中..................................
    Email: longwsheng@gmail.com
    MSN:longwsheng@hotmail.com
    QQ:82003806
    歡迎加為好友,共同it共同成長^^_^^^^_^^^^_^^^^_^^^^_^^^^
    只看该作者    顶部
    离线 reborn
    一般会员



    精华贴数 1
    个人空间 0
    技术积分 447 (5210)
    社区积分 6 (16881)
    注册日期 2001-12-13
    论坛徽章:2
    CTO参与奖授权会员    
          

    发表于 2005-4-28 15:47 
    多谢hmxxyy和jametong,问题解决


    只看该作者    顶部
    离线 hmxxyy
    高级会员


    精华贴数 2
    个人空间 0
    技术积分 2381 (818)
    社区积分 19 (9556)
    注册日期 2004-9-17
    论坛徽章:5
    会员2006贡献徽章授权会员ITPUB新首页上线纪念徽章数据库板块每日发贴之星数据库板块每日发贴之星 
          

    发表于 2005-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

    绝!


    __________________
    http://hmxxyy.itpub.net只听胡琴声缠绵宛转,却是一曲《凤求凰》...
    只看该作者    顶部
    离线 呆呆木
    我当妈妈了


    精华贴数 0
    个人空间 0
    技术积分 651 (3544)
    社区积分 13053 (154)
    注册日期 2003-11-13
    论坛徽章:13
    会员2007贡献徽章授权会员IT宝贝   
          

    发表于 2005-4-30 08:17 
    学习,谢谢!


    只看该作者    顶部
    离线 shiguibao
    永不言棄


    精华贴数 2
    个人空间 130
    技术积分 8286 (208)
    社区积分 19946 (99)
    注册日期 2004-11-18
    论坛徽章:81
    季节之章:夏奥运纪念徽章2010年世界杯参赛球队:科特迪瓦2010新春纪念徽章2010新春纪念徽章巴塞罗那
    2010新春纪念徽章2010年世界杯参赛球队:意大利马德里竞技巴塞罗那祖国60周年纪念徽章切尔西

    发表于 2005-4-30 10:12 
    收了


    __________________
    现实是残酷的,更残酷的是你永远也看不到现实的全部

    火星加速器!网游最佳伴侣
    想用免费进销存软件吗?进来就是
    只看该作者    顶部
    相关内容


    CopyRight 1999-2006 itpub.net All Right Reserved.
    北京皓辰网域网络信息技术有限公司. 版权所有
    E-mail:Webmaster@itpub.net
    网站律师 隐私政策 知识产权声明
    京ICP证:060528号 联系我们