2012-08-07 53 views
1

我有一个数据:如何根据条件对数据进行分组并依次对这些组进行编号?

with t as 
(select 1 as id, '1324345' as amount, 7821 as code 
    from dual 
    union all 
    select 2 as id, 'current' as amount, 2210 as code 
    from dual 
    union all 
    select 3 as id, 'link' as amount, 2210 as code 
    from dual 
    union all 
    select 4 as id, '56236400' as amount, 6740 as code 
    from dual 
    union all 
    select 5 as id, '45562330' as amount, 5578 as code 
    from dual 
    union all 
    select 6 as id, '34875930' as amount, 5828 as code 
    from dual 
    union all 
    select 7 as id, 'current' as amount, 8520 as code 
    from dual 
    union all 
    select 8 as id, 'link' as amount, 8520 as code 
    from dual 
    union all 
    select 9 as id, '6731347060' as amount, 4740 as code 
    from dual 
    union all 
    select 10 as id, '346008600' as amount, 6575 as code 
    from dual) 
select * from t 

,我希望得到以下几点:

with t as 
(select 1 as id, '1324345' as amount, 7821 as code, 1 as group_id 
    from dual 
    union all 
    select 2 as id, 'current' as amount, 2210 as code, 2 as group_id 
    from dual 
    union all 
    select 3 as id, 'link' as amount, 2210 as code, 2 as group_id 
    from dual 
    union all 
    select 4 as id, '56236400' as amount, 6740 as code, 3 as group_id 
    from dual 
    union all 
    select 5 as id, '45562330' as amount, 5578 as code, 3 as group_id 
    from dual 
    union all 
    select 6 as id, '34875930' as amount, 5828 as code, 3 as group_id 
    from dual 
    union all 
    select 7 as id, 'current' as amount, 8520 as code, 4 as group_id 
    from dual 
    union all 
    select 8 as id, 'link' as amount, 8520 as code, 4 as group_id 
    from dual 
    union all 
    select 9 as id, '6731347060' as amount, 4740 as code, 5 as group_id 
    from dual 
    union all 
    select 10 as id, '346008600' as amount, 6575 as code, 5 as group_id 
    from dual) 
select * from t 

的条件是“量”字段的值。它可能是数字或文字。

UPD:预期结果:

id | amount  | code | group_id 
--------------------------------------------- 
1 | 1324345  | 7821 |  1 
--------------------------------------------- 
2 | current  | 2210 |  2 
--------------------------------------------- 
3 | link  | 2210 |  2 
--------------------------------------------- 
4 | 56236400 | 6740 |  3 
--------------------------------------------- 
5 | 45562330 | 5578 |  3 
--------------------------------------------- 
6 | 34875930 | 5828 |  3 
--------------------------------------------- 
7 | current  | 8520 |  4 
--------------------------------------------- 
8 | link  | 8520 |  4 
--------------------------------------------- 
9 | 6731347060 | 4740 |  5 
--------------------------------------------- 
10 | 346008600 | 6575 |  5 
--------------------------------------------- 

编辑:最好的解决办法:

with tmain as 
(select t.*, 
     decode(isnumeric(Amount), 
       lag(isnumeric(Amount)) over(order by id), 
       null, 
       1) lg 
    from t 
    order by id) 
select id, amount, code, count(lg) over(order by id) group_id from tmain 

ISNUMERIC功能(基于@valexhome答案):

CREATE OR REPLACE FUNCTION ISNUMERIC (Str IN CHAR) RETURN NUMBER AS 
    TMP int; 
BEGIN 
    if Str is null then 
     return(null); 
    end if; 
    TMP:=TO_NUMBER(Str); 
    RETURN (1); 
EXCEPTION 
    WHEN OTHERS THEN 
     RETURN (0); 
END; 
+0

对不起!我不明白你的问题。你能举一个你预期的结果的例子吗? – Tim 2012-08-07 07:59:27

+0

我已将它添加到我的问题中 – DmitryB 2012-08-07 08:13:06

+0

@DmitryB:您需要确切的顺序,或者您只需要说出哪个字段只是数字,哪个字段包含字母? – mcha 2012-08-07 08:25:50

回答

1

这里是功能ISNUMERIC到查询运行之前定义:

CREATE OR REPLACE FUNCTION ISNUMERIC (Str IN CHAR) RETURN NUMBER AS 
    TMP int; 
BEGIN 
    if Str is null then 
     return(null); 
    end if; 
    --if input null return NULL 
    TMP:=TO_NUMBER(Str); 
    RETURN (1); 
EXCEPTION 
    WHEN OTHERS THEN 
     RETURN (0); 
END; 

这里是查询:

select id, amount, code, 
(
select count(id) 
from t Tab 
where tab.id<=t.id 
    and 
    isnumeric(Amount)<>nvl(isnumeric((select Amount from t d1 where d1.id=(select max(d.id) from t d where (d.id<Tab.id)))),isnumeric(Amount)-1) 
) Group_id 

from t order by id 
+0

这个解决方案对大量数据(超过1000行)速度很慢。有没有可能加快它? – DmitryB 2012-08-14 10:15:38

1

我找到了另一种解决方案:

with tmain as 
(select t.*, 
     decode(isnumeric(Amount), 
       lag(isnumeric(Amount)) over(order by id), 
       null, 
       1) lg 
    from t 
    order by id) 
select id, amount, code, count(lg) over(order by id) group_id from tmain 

它适用于大量数据的罚款。

相关问题