ITPub博客

首页 > Linux操作系统 > Linux操作系统 > SQL趣题:分组按位求或

SQL趣题:分组按位求或

原创 Linux操作系统 作者:0x0x0x 时间:2012-06-26 15:13:01 0 删除 编辑
题目:
要求:按照id分组,bitnum 按位求或
 
建表语句及测试数据如下:
SQL> create table table_bit (id number(6,0),bitnum varchar2(10));
表已创建。
SQL> insert into table_bit values(1,'001');
已创建 1 行。
SQL> insert into table_bit values(1,'010');
已创建 1 行。
SQL> insert into table_bit values(1,'100');
已创建 1 行。
SQL> insert into table_bit values(2,'000');
已创建 1 行。
SQL> insert into table_bit values(2,'001');
已创建 1 行。
SQL> commit;
提交完成。
SQL> select * from table_bit;
        ID BITNUM
---------- ----------
         2 001
         1 100
         2 100
         1 110
         1 001
         1 010
         1 100
         2 000
         2 001
已选择9行。
 
 
以下是我的SQL:
SQL> COL merge_bit FOR A20
SQL> WITH t AS
  2    (SELECT rownum rn,
  3      tb.id,
  4      tb.bitnum,
  5      to_number(SUBSTR(tb.bitnum,1,1)) b1,
  6      to_number(SUBSTR(tb.bitnum,2,1)) b2,
  7      to_number(SUBSTR(tb.bitnum,3,1)) b3
  8    FROM table_bit tb
  9    )
10  SELECT t.id,
11    DECODE(SIGN(SUM(t.b1)),1,1,0)
12    ||DECODE(SIGN(SUM(t.b2)),1,1,0)
13    ||DECODE(SIGN(SUM(t.b3)),1,1,0) merge_bit
14  FROM t
15  GROUP BY t.id
16  /
        ID MERGE_BIT
---------- --------------------
         1 111
         2 001
SQL>
 
 
有人给出了如下的巧妙解法,但是这种解法有个局限,当同一位有多个1时便不能求出正确结果了。
 
SQL> SELECT id,
  2    lpad(SUM(bitnum), 3, '0')
  3  FROM
  4    (SELECT DISTINCT id, bitnum FROM table_bit
  5    )  t
  6  GROUP BY id
  7  /
        ID LPAD(S
---------- ------
         1 221
         2 101
已用时间:  00: 00: 00.01
SQL>

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26977915/viewspace-733832/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2012-06-26

  • 博文量
    35
  • 访问量
    95884