我使用的是oracle数据库,一个表中存在若干条数据,可能没有id列。1.先从该表中抽取数据并按照指定的顺序排序;
2.以4条数据为一组,将4条中的2,3位置的数据颠倒位置。(若总条数对4取的余数大于等于三,那么2的操作就执行);
3.获得新的排序结果。ps:有没有可能仅仅用sql语句完成上面的需求?望各位给小弟些指点,谢谢啦~~~

解决方案 »

  1.   

    select t.*,case when mod(rn,4)=3 then rn-1.5 else rn end case 
    from  (select w.*,row_number() over(order by column) rn from table w) t
    order by case
      

  2.   

    select ename,job,sal,decode(rn1,3,2,2,3,rn1) as new_rn,rn old_rn from 
    (
    select ename,job,sal,mod(rn+1,4) as rn1,rn rn from 
    (select ename,job,sal,rownum rn from emp e )
    )
    order by old_rn
    可以4个分组实现2,3调换
      

  3.   


    测试数据创建的话很简单,
    create table test (test number(10));
    insert into test(test)
    values
    (1);
    insert into test(test)
    values
    (2);
    insert into test(test)
    values
    (3);
    insert into test(test)
    values
    (4);
    insert into test(test)
    values
    (5);
    insert into test(test)
    values
    (6);
    insert into test(test)
    values
    (7);
    insert into test(test)
    values
    (8);
    insert into test(test)
    values
    (9);
    insert into test(test)
    values
    (10);目前表中的数据就是1,2,3,4,5,6,7,8,9,10
    想要得到的结果就是1,3,2,4,5,7,6,8,9,10
    若表中的数据为:1,2,3,4,5,6,7,8,9,10,11
    想要得到的结果就是:1,3,2,4,5,7,6,8,9,11,10那么这样的过程能实现吗?
      

  4.   

    select ename,job,sal,decode(rn1,1,rn+1,2,rn-1,rn) as new_rn,rn old_rn from 
    (
    select ename,job,sal,mod(rn-1,4) as rn1,rn rn from 
    (select ename,job,sal,rownum rn from emp e )
    )
    order by old_rn结果如下:
    ENAME SAL NEW_RN OLD_RN
    SMITH 800.00 1 1
    ALLEN 1600.00 3 2
    WARD 1250.00 2 3
    JONES 2975.00 4 4
    MARTIN 1250.00 5 5
    BLAKE 2850.00 7 6
    CLARK 2450.00 6 7
    SCOTT 3000.00 8 8
    KING 5000.00 9 9
    TURNER 1500.00 11 10
    ADAMS 1100.00 10 11
    JAMES 950.00 12 12
    FORD  3000.00 13 13
    MILLER 1300.00 15 14
    杨 6080.00 14 15
    liping 5000.00 16 16
    YA_PING 4000.00 17 17
    杨平 6080.00 19 18
      

  5.   

    我测试过了,就算用new_rn来进行排序也是有问题的。不是我在6楼所描述的结果。
      

  6.   

    select decode(rn1,1,rn+1,2,rn-1,rn) as new_rn,rn old_rn from 
    (
    select mod(rn-1,4) as rn1,rn rn from 
    (select rownum rn from emp where rownum<17 )
    )
    order by old_rn
    结果怎么不是了啊
    我汗.....
    NEW_RN OLD_RN
    1 1
    3 2
    2 3
    4 4
    5 5
    7 6
    6 7
    8 8
    9 9
    11 10
    10 11
    12 12
    13 13
    15 14
    14 15
    16 16
      

  7.   

    谢谢你哦,不过你该把order by的位置换成new_rn。那样结果就对了,还有刚刚说结果不对是因为在用你第一次写的代码,做的测试,呵呵~~