表bs
id    name              begin       end   number              ss
1     A                 1           1     1                   1
1     A                 2           2     1                   2
1     A                 3           3     1                   3
1     A                 4           4     1                   4
1     A                 6           6     1                   6
1     A                 7           7     1                   7
2     B                 8           8     1                   8
2     B                 9           9     1                   9
2     B                 10          10    1                   10
2     C                 11          11    1                   11
2     C                 12          12    1                   12查询结果:
id    name              begin       end   number              ss
1     A                 1           4     4                   10
1     A                 6           7     2                   13
2     B                 8           10    3                   27
2     C                 11          12    2                   23这样的Oracle语句应该怎么写?请高手帮忙,谢谢

解决方案 »

  1.   

    表bs 
    id    name              begin      end  number              ss 
    1    A                   1          1     1                  1 
    1    A                   2          2     1                  2 
    1    A                   3          3     1                  3 
    1    A                   4          4     1                  4 
    1    A                   6          6     1                  6 
    1    A                   7          7     1                  7 
    2    B                   8          8     1                  8 
    2    B                   9          9     1                  9 
    2    B                  10          10    1                  10 
    2    C                  11          11    1                  11 
    2    C                  12          12    1                  12 查询结果: 
    id    name              begin      end  number              ss 
    1    A                  1          4     4                  10 
    1    A                  6          7     2                  13 
    2    B                  8          10    3                  27 
    2    C                  11         12    2                  23 在线等,谢谢高手们了
      

  2.   

    select aaa.id,aaa.name, min(begin) begin ,max(begin) end,count(begin) number,sum(ss) ss
    from(
    select aa.* ,sum(temp_a) over(partition by id order by begin) temp_group
    from (
    select a.*,decode(beging-lag(begin,1,-1) over(partition by id order by begin),1,0,1)) temp_a
          from bs a) aa) aaa
    group by aaa.id,aaa.name,aaa.temp_group
      

  3.   

    /* Formatted on 2008/07/08 15:37 (Formatter Plus v4.8.8) */
    WITH bs AS
         (SELECT 1 ID, 'A' NAME, 1 BEGIN, 1 END, 1 "number", 1 ss
            FROM DUAL
          UNION ALL
          SELECT 1, 'A', 2, 2, 1, 2
            FROM DUAL
          UNION ALL
          SELECT 1, 'A', 3, 3, 1, 3
            FROM DUAL
          UNION ALL
          SELECT 1, 'A', 4, 4, 1, 4
            FROM DUAL
          UNION ALL
          SELECT 1, 'A', 6, 6, 1, 6
            FROM DUAL
          UNION ALL
          SELECT 1, 'A', 7, 7, 1, 7
            FROM DUAL
          UNION ALL
          SELECT 2, 'B', 9, 9, 1, 9
            FROM DUAL
          UNION ALL
          SELECT 2, 'B', 8, 8, 1, 8
            FROM DUAL
          UNION ALL
          SELECT 2, 'B', 10, 10, 1, 10
            FROM DUAL
          UNION ALL
          SELECT 2, 'C', 11, 11, 1, 11
            FROM DUAL
          UNION ALL
          SELECT 2, 'C', 12, 12, 1, 12
            FROM DUAL)
    SELECT   aaa.ID, aaa.NAME, MIN (BEGIN) BEGIN, MAX (BEGIN) END,
             COUNT (BEGIN) "number", SUM (ss) ss
        FROM (SELECT aa.*,
                     SUM (temp_a) OVER (PARTITION BY ID ORDER BY BEGIN)
                                                                       temp_group
                FROM (SELECT a.*,
                             DECODE
                                (  begin
                                 - LAG (BEGIN, 1, -1) OVER (PARTITION BY ID ORDER BY BEGIN),
                                 1, 0,
                                 1
                                ) temp_a
                        FROM bs a) aa) aaa
    GROUP BY aaa.ID, aaa.NAME, aaa.temp_group结果,就是显示顺序不对,需要的话,就加order by
    Row# ID NAME BEGIN END number SS1 2 B 8 10 3 27
    2 2 C 11 12 2 23
    3 1 A 6 7 2 13
    4 1 A 1 4 4 10
      

  4.   


    SELECT   aaa.ID, aaa.NAME, MIN (BEGIN) BEGIN, MAX (BEGIN) END,
             COUNT (BEGIN) "number", SUM (ss) ss
        FROM (SELECT aa.*,
                     SUM (temp_a) OVER (PARTITION BY ID ORDER BY BEGIN)
                                                                       temp_group
                FROM (SELECT a.*,
                             DECODE
                                (  begin
                                 - LAG (BEGIN, 1, -1) OVER (PARTITION BY ID ORDER BY BEGIN),
                                 1, 0,
                                 1
                                ) temp_a
                        FROM bs a) aa) aaa
    GROUP BY aaa.ID, aaa.NAME, aaa.temp_group
    order by 1,3结果
    Row# ID NAME BEGIN END number SS1 1 A 1 4 4 10
    2 1 A 6 7 2 13
    3 2 B 8 10 3 27
    4 2 C 11 12 2 23
      

  5.   

    说下思路
    先把每个begin与上一条纪录的begin相减比较,如果大于1,就在新的字段temp_a写1,等于1的,写0
    即连续的写0,与上一条纪录不连续的,写1
    然后通过sum来形成新的分组temp_group(此处是利用顺序累加的方法实现新的分组)最后层就比较容易看懂了,通过三个分组条件,分别求得min,max,sum,count
      

  6.   

    这里简要说下sum() over的用法
    假设 
    a
    1
    2
    3
    4
    用sum(a) (order by a)
    会产生以下的效果
    a  sum(a) (order by a)
    1  1
    2  3
    3  6
    4  10
    所以上面第一层语句的结果DECODE(  begin- LAG (BEGIN, 1, -1) OVER (PARTITION BY ID ORDER BY BEGIN),1, 0,1) temp_a
    begin    temp_a
    1        1
    2        0
    3        0
    4        0
    6        1
    7        0
    第二层 SUM (temp_a) OVER (PARTITION BY ID ORDER BY BEGIN)
                                                                       temp_group
    begin    temp_group
    1        1
    2        1
    3        1
    4        1
    6        2
    7        27        0
      

  7.   

    不行啊,我换成我想要的表时,出问题,因为我用的多是varchar2类型的
      

  8.   

    哪几个字段是varchar2啊,你可以用to_number转换啊,再说oracle也会自己隐性转换啊
      

  9.   


    create table dhk_bs

    bs_kaid varchar2(20),
    bs_mz number,
    bs_begin varchar2(100),
    bs_end varchar2(100),
    bs_number int,
    bs_ss number,
    bs_kahao varchar2(100),
    bs_zdh varchar2(30),
    bs_datetime varchar2(30)
    );
    数据:
    16 30 6955319844e 6955319844e 1 27.3 73300064719 10111178 28-6月 -08
    16 30 6955319848e 6955319848e 1 27.3 73300061098 10111178 28-6月 -08
    28 30 200804230400477 200804230400477 1 29.4 277510597779477777 10111515 28-6月 -08
    28 50 200804230500179 200804230500179 1 49 277510898549548789 10111515 28-6月 -08
    28 50 200804230500191 200804230500191 1 49 277510098589749931 10111515 28-6月 -08
    28 50 200804230500217 200804230500217 1 49 277510898109454107 10111515 28-6月 -08
    28 50 200804230500221 200804230500221 1 49 277510598879357241 10111515 28-6月 -08
    28 50 200804230500227 200804230500227 1 49 277510898969754257 10111515 28-6月 -08
    28 30 200804230400572 200804230400572 1 29.4 277510497949888782 10111515 28-6月 -08
    28 30 200804230400556 200804230400556 1 29.4 277510797069680586 10111515 28-6月 -08
    28 30 200804230400596 200804230400596 1 29.4 277510597959786976 10000148 28-6月 -08
    28 30 200804230400598 200804230400598 1 29.4 277510197039787968 10000148 28-6月 -08
    28 30 200804230400599 200804230400599 1 29.4 277510297109580979 10000148 28-6月 -08
    28 30 200804230400600 200804230400600 1 29.4 277510297459997050 10000148 28-6月 -08
    28 30 200804230400601 200804230400601 1 29.4 277510897879190041 10000148 28-6月 -08
    28 30 200804230400602 200804230400602 1 29.4 277510297599991042 10000148 28-6月 -08
    28 30 200804230400603 200804230400603 1 29.4 277510097639796013 10000148 28-6月 -08
    28 30 200804230400604 200804230400604 1 29.4 277510197199991034 10000148 28-6月 -08
    28 30 200804230400605 200804230400605 1 29.4 277510197209192035 10000148 28-6月 -08
      

  10.   

    你自己先分析下,begin里会出现哪些字母,纯数字好处理,有字母的话,很麻烦的
      

  11.   

    create table dhk_bs

    bs_kaid varchar2(20),
    bs_mz number,
    bs_begin varchar2(100),
    bs_end varchar2(100),
    bs_number int,
    bs_ss number,
    bs_kahao varchar2(100),
    bs_zdh varchar2(30),
    bs_datetime varchar2(30)
    );
    上面表字段和下面数据对应的
    数据:
    28 100 200804230600155 200804230600155 1 98 277510199284642565 10111177 29-6月 -08
    28 100 200804230600156 200804230600156 1 98 277510099784243546 10111515 29-6月 -08
    28 100 200804230600157 200804230600157 1 98 277510099504444587 10111333 29-6月 -08
    28 100 200804230600158 200804230600158 1 98 277510099874241508 10111111 29-6月 -08
    28 100 200804230600159 200804230600159 1 98 277510599954044509 10111359 29-6月 -08
    28 100 200804230600160 200804230600160 1 98 277510899444641600 10111110 29-6月 -08
    28 100 200804230600161 200804230600161 1 98 277510699824249601 10111110 29-6月 -08
    28 100 200804230600162 200804230600162 1 98 277510099334043622 10111117 29-6月 -08
    16 20 6955309856e 6955309856e 1 18.2 73300265242 10111117 28-6月 -08
    16 20 6955309857e 6955309857e 1 18.2 73300532461 10111273 28-6月 -08
    16 30 6955319843e 6955319843e 1 27.3 73300702393 10111117 28-6月 -08
    16 30 6955319844e 6955319844e 1 27.3 73300064719 10111178 28-6月 -08
    16 30 6955319845e 6955319845e 1 27.3 73300799293 10111273 28-6月 -08
    16 30 6955319846e 6955319846e 1 27.3 73300014619 10111273 28-6月 -08
    16 30 6955319847e 6955319847e 1 27.3 73300747783 10111273 28-6月 -08
    16 30 6955319848e 6955319848e 1 27.3 73300061098 10111178 28-6月 -08
    31 50 dgczk0020763815 dgczk0020763815 1 49 dgczk0020763815 10111127 28-6月 -08
    31 50 dgczk0020763816 dgczk0020763816 1 49 dgczk0020763816 10111368 28-6月 -08
    31 50 dgczk0020763817 dgczk0020763817 1 49 dgczk0020763817 10111368 28-6月 -08
    31 50 dgczk0020763818 dgczk0020763818 1 49 dgczk0020763818 10111273 28-6月 -08
    31 50 dgczk0020763819 dgczk0020763819 1 49 dgczk0020763819 10111273 28-6月 -08
    31 50 dgczk0020763820 dgczk0020763820 1 49 dgczk0020763820 10111230 28-6月 -08
    31 50 dgczk0020763821 dgczk0020763821 1 49 dgczk0020763821 10111230 28-6月 -08
    31 100 dgczk0031534591 dgczk0031534591 1 98 dgczk0031534591 10111273 28-6月 -08
    31 100 dgczk0031534592 dgczk0031534592 1 98 dgczk0031534592 10111273 28-6月 -08
    31 100 dgczk0031534593 dgczk0031534593 1 98 dgczk0031534593 10111273 28-6月 -08
    31 100 dgczk0031534594 dgczk0031534594 1 98 dgczk0031534594 10111273 28-6月 -08
    31 100 dgczk0031534595 dgczk0031534595 1 98 dgczk0031534595 10111273 28-6月 -08
    31 100 dgczk0031534596 dgczk0031534596 1 98 dgczk0031534596 10111230 28-6月 -08
    31 100 dgczk0031534597 dgczk0031534597 1 98 dgczk0031534597 10111230 28-6月 -08
    31 100 dgczk0031534598 dgczk0031534598 1 98 dgczk0031534598 10111478 29-6月 -08
    31 100 dgczk0031534599 dgczk0031534599 1 98 dgczk0031534599 10111478 29-6月 -08


    在这先谢谢大家了,但愿大家帮想出方法!
      

  12.   

    只能看出来数字部分还算有规律可以看成连续的,字母部分没有规律,忽前忽后的,不过好像没出现在当中,还好办点
    只有想办法把字母全过滤掉
    用 trim(Translate(bs_begin,'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',' ')) 
    整个语句改成SELECT   aaa.ID, aaa.NAME, MIN (BEGIN) BEGIN, MAX (BEGIN) END,
             COUNT (BEGIN) "number", SUM (ss) ss
        FROM (SELECT aa.*,
                     SUM (temp_a) OVER (PARTITION BY ID ORDER BY BEGIN)
                                                                       temp_group
                FROM (SELECT a.*,
                             DECODE
                                (   to_number(trim(Translate(bs_begin,'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',' '))) 
                                 - LAG (to_number(trim(Translate(bs_begin,'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',' '))) 
                                    , 1, -1) OVER (PARTITION BY ID ORDER BY BEGIN),
                                 1, 0,
                                 1
                                ) temp_a
                        FROM bs a) aa) aaa
    GROUP BY aaa.ID, aaa.NAME, aaa.temp_group
    order by 1,3
      

  13.   

    我刚才试了下,用
    Translate('asder12asd34asd','1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ','1234567890')
    就可以把所有字母全滤掉,这样就算当中有字母也没关系
      

  14.   

    hebo2005兄弟,谢谢了,我的统计还没做完,因为不只这一个表的,我自己慢慢想办法先了,要是搞不定到时再发帖子找你了,谢谢!!~~