楼主: reborn

[精华] 如何sql查询出连续号码段

[复制链接]
论坛徽章:
1
授权会员
日期:2006-05-08 09:05:38
21#
发表于 2006-9-28 13:50 | 只看该作者
学习一下!

使用道具 举报

回复
论坛徽章:
0
22#
发表于 2006-9-28 14:57 | 只看该作者
2 楼的字句 select * from gap a where not exists
      (select null from gap b where b.id = a.id and a.seq = b.seq - 1)    b都为空了,怎么还有b.id=a.id的概念,请大家给我指点一下

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
38
ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14现任管理团队成员
日期:2012-10-18 17:11:21版主4段
日期:2012-05-15 15:24:112012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23
23#
发表于 2006-9-28 15:55 | 只看该作者
看到一群牛

使用道具 举报

回复
论坛徽章:
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
24#
发表于 2007-6-24 21:26 | 只看该作者
最初由 hmxxyy 发布
[B]还真引出玉来了

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

绝! [/B]


这个好啊,我现在都用到了!

使用道具 举报

回复
论坛徽章:
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
25#
发表于 2007-6-24 21:35 | 只看该作者
LZ是求单个号连续的进行合并,那么如何将 连续的号段进行合并呢?

[PHP]请看
SQL> With x As
  2  (
  3  Select '002' eba002,'001' eba083,'100' eba084 From dual
  4  Union
  5  Select '002','101','200' From dual
  6  Union
  7  Select '002','201','250' From dual
  8  Union
  9  Select '002','301','400' From dual
10  Union
11  Select '003','001','200' From dual
12  Union
13  Select '003','300','400' From dual
14  )
15  Select Distinct eba002,decode(a,1,Min(eba083) over (Partition By eba002,a),eba083),
16  decode(a,1,max(eba084) over (Partition By eba002,a),eba084) From (
17  Select eba002,eba083,eba084,
18  eba083 - lag(eba084,1,eba083-1) over (Partition By eba002 Order By eba083) a
19  From x
20  )
21  /

EBA002 DECODE(A,1,MIN(EBA083)OVER(PAR DECODE(A,1,MAX(EBA084)OVER(PAR
------ ------------------------------ ------------------------------
002    001                            250
002    301                            400
003    001                            200
003    300                            400

SQL>
[/PHP]

使用道具 举报

回复
论坛徽章:
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
26#
发表于 2007-6-24 21:55 | 只看该作者
注意下,上面的不能用下面的语句替换。

[PHP] 和数据有关

SQL> With x As
  2  (
  3  Select '002' eba002,'001' eba083,'100' eba084 From dual
  4  Union
  5  Select '002','101','200' From dual
  6  Union
  7  Select '002','201','250' From dual
  8  Union
  9  Select '002','301','400' From dual
10  Union
11  Select '003','001','200' From dual
12  Union
13  Select '003','300','400' From dual
14  )
15  Select eba002,Min(eba083),Max(eba084) From (
16  Select eba002,eba083,eba084,
17  eba083 - lag(eba084,1,eba083-1) over (Partition By eba002 Order By eba083) a
18  From x
19  ) Group By eba002,a
20  /

EBA002 MIN(EBA083) MAX(EBA084)
------ ----------- -----------
002    001         250
002    301         400
003    001         200
003    300         400

可以得到正确的结果,可是添加一条信息后,就不对了。

SQL> With x As
  2  (
  3  Select '002' eba002,'001' eba083,'100' eba084 From dual
  4  Union
  5  Select '002','101','200' From dual
  6  Union
  7  Select '002','201','250' From dual
  8  Union
  9  Select '002','301','400' From dual
10  Union
11  Select '003','001','200' From dual
12  Union
13  Select '003','300','400' From dual
14  Union
15  Select '003','500','600' From dual
16  )
17  Select eba002,Min(eba083),Max(eba084) From (
18  Select eba002,eba083,eba084,
19  eba083 - lag(eba084,1,eba083-1) over (Partition By eba002 Order By eba083) a
20  From x
21  ) Group By eba002,a
22  /

EBA002 MIN(EBA083) MAX(EBA084)
------ ----------- -----------
002    001         250
002    301         400
003    001         200
003    300         600

大家可以看到最后一条是不对的,而LS的语句就可以避免这样的情况

SQL> With x As
  2  (
  3  Select '002' eba002,'001' eba083,'100' eba084 From dual
  4  Union
  5  Select '002','101','200' From dual
  6  Union
  7  Select '002','201','250' From dual
  8  Union
  9  Select '002','301','400' From dual
10  Union
11  Select '003','001','200' From dual
12  Union
13  Select '003','300','400' From dual
14  Union
15  Select '003','500','600' From dual
16  )
17  Select Distinct eba002,decode(a,1,Min(eba083) over (Partition By eba002,a),eba083),
18  decode(a,1,max(eba084) over (Partition By eba002,a),eba084) From (
19  Select eba002,eba083,eba084,
20  eba083 - lag(eba084,1,eba083-1) over (Partition By eba002 Order By eba083) a
21  From x
22  )
23  /

EBA002 DECODE(A,1,MIN(EBA083)OVER(PAR DECODE(A,1,MAX(EBA084)OVER(PAR
------ ------------------------------ ------------------------------
002    001                            250
002    301                            400
003    001                            200
003    300                            400
003    500                            600

SQL>

[/PHP]

使用道具 举报

回复
论坛徽章:
4
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:442010新春纪念徽章
日期:2010-03-01 11:19:502011新春纪念徽章
日期:2011-02-18 11:43:362012新春纪念徽章
日期:2012-01-04 11:53:29
27#
发表于 2007-6-25 09:50 | 只看该作者
SELECT B.KSHM || ',' || A.KSHM
  FROM (SELECT T1.KSHM, ROW_NUMBER() OVER(ORDER BY T1.KSHM) T1ROW
          FROM TEST T1
         WHERE (FPHM, KSHM) NOT IN
               (select A.FPHM, A.KSHM
                  from test A
                 inner join test B ON A.FPHM = B.FPHM
                 WHERE TO_NUMBER(A.KSHM) - TO_NUMBER(B.KSHM) IN (-1)
                --ORDER BY A.FPHM DESC,A.KSHM ASC
                )
         ORDER BY T1.KSHM) A
INNER JOIN (SELECT T1.KSHM, ROW_NUMBER() OVER(ORDER BY T1.KSHM) T1ROW
               FROM TEST T1
              WHERE (FPHM, KSHM) NOT IN
                    (select A.FPHM, A.KSHM
                       from test A
                      inner join test B ON A.FPHM = B.FPHM
                      WHERE TO_NUMBER(A.KSHM) - TO_NUMBER(B.KSHM) IN (1)
                     --ORDER BY A.FPHM DESC,A.KSHM ASC
                     )
              ORDER BY T1.KSHM) B ON A.T1ROW = B.T1ROW

使用道具 举报

回复
论坛徽章:
1
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
28#
发表于 2007-8-20 10:59 | 只看该作者
hanjs 的方法有问题执行结果中第一列(002  001  250)最后一列为什么是“250”而不是“100”?

使用道具 举报

回复
论坛徽章:
2
2010新春纪念徽章
日期:2010-03-01 11:04:582011新春纪念徽章
日期:2011-02-18 11:43:33
29#
发表于 2007-9-4 22:11 | 只看该作者
drop table t  ;

create  table t  (
     fphm  varchar2(10) not  null,
     kshm  number(5) not  null
    ) ;

insert into t  values  ( '1' , 1  ) ;
insert into t  values  ( '1' , 3  ) ;
insert into t  values  ( '1' , 4  ) ;
insert into t  values  ( '1' , 7  ) ;
insert into t  values  ( '1' , 8  ) ;
insert into t  values   ( '1' , 9  ) ;
insert into t  values   ( '1' , 10  ) ;

insert into t  values  ( '2' , 1  ) ;
insert into t  values  ( '2' , 2  ) ;
insert into t  values  ( '2' , 3  ) ;
insert into t  values  ( '2' , 8  ) ;
insert into t  values  ( '2' , 9  ) ;
insert into t  values  ( '2' , 10  ) ;
insert into t  values  ( '2' , 13  ) ;
commit ;


select  
  m.fphm,   s.kshm,  e.kshm
from
(select  unique fphm from  t)  m  
  join
( select  
        fphm  , kshm  , ROW_NUMBER()  over( order by fphm,kshm )  r
  from
        t  t_s
  where  
        t_s.kshm -1 not in  (  select  kshm from t  where  fphm = t_s.fphm  )  order by  fphm,kshm
) s   on m.fphm = s.fphm
join
(  select  
       fphm  , kshm , ROW_NUMBER()  over( order by fphm,kshm ) r
   from
       t  t_e
  where  
      t_e.kshm +1 not in  (  select  kshm from t  where  fphm = t_e.fphm  )  order by  fphm,kshm
) e  on m.fphm = e.fphm and s.r = e.r
order by
  m.fphm,  s.kshm


FPHM             KSHM       KSHM
---------- ---------- ----------
1                   1          1
1                   3          4
1                   7         10
2                   1          3
2                   8         10
2                  13         13

6 rows selected.

使用道具 举报

回复
论坛徽章:
1
30#
发表于 2007-9-5 08:05 | 只看该作者
高手,受 教了

使用道具 举报

回复

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

本版积分规则 发表回复

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