假若一列的值为 -100 200 -300 50 80 -90
要求获取多列绝对值的最大值,也就是300,再保留正负号
结果 -300 
是在无招,大仙教几招吧

解决方案 »

  1.   


    --你的列固定吗?
    WITH tab AS(
    SELECT -100 col1,200 col2,-300 col3,50 col4,80 col5,-90 col6 FROM dual
    ),
    temp AS(
    SELECT Abs(col1) col,Sign(col1) flag FROM tab UNION ALL  
    SELECT Abs(col2) col,Sign(col2) flag FROM tab UNION ALL  
    SELECT Abs(col3) col,Sign(col3) flag FROM tab UNION ALL  
    SELECT Abs(col4) col,Sign(col4) flag FROM tab UNION ALL  
    SELECT Abs(col5) col,Sign(col5) flag FROM tab UNION ALL  
    SELECT Abs(col6) col,Sign(col6) flag FROM tab
    )
    SELECT flag*val result FROM (
        SELECT Max(col)over(ORDER BY col desc) val ,flag,ROWNUM rn FROM temp 
    ) WHERE rn=1
    RESULT
    --------
      -300
      

  2.   


    --上面有问题,这样:SELECT flag*val result FROM (
        SELECT Max(col)over(ORDER BY col desc) val ,flag FROM temp 
    ) WHERE ROWNUM =1
      

  3.   

    给一个通用的吧:
    select a from tm where (a = (select max(abs(a)) from tm)) or a + (select max(abs(a)) from tm) = 0;+------+
    | a    |
    +------+
    | -300 |
    +------+
      

  4.   


    这只适用于该表中仅有1行数据的情况楼主好象是要对一个表的每一行都找出绝对值最大的那个值
    用存储过程游标肯定可以解决,单纯用SQL想不到有什么好办法
      

  5.   


    加个rownum 在按照rownum分组倒是也行
      

  6.   


    WITH tab AS(
    SELECT -100 col1,200 col2,-300 col3,50 col4,80 col5,-90 col6 FROM dual UNION ALL  
    SELECT 60,-2,4,-100,7,0  FROM dual
    ),
    temp AS(
    SELECT Abs(col1) col,Sign(col1) flag,rownum rowcn FROM tab UNION ALL  
    SELECT Abs(col2) col,Sign(col2) flag,rownum rowcn  FROM tab UNION ALL  
    SELECT Abs(col3) col,Sign(col3) flag,rownum rowcn  FROM tab UNION ALL  
    SELECT Abs(col4) col,Sign(col4) flag,rownum rowcn  FROM tab UNION ALL  
    SELECT Abs(col5) col,Sign(col5) flag,rownum rowcn  FROM tab UNION ALL  
    SELECT Abs(col6) col,Sign(col6) flag,rownum rowcn  FROM tab
    )
    --每行的绝对值最大的那个值
    SELECT rowcn,flag*val result FROM (
        SELECT Max(col) over (PARTITION BY rowcn ORDER BY col desc) val ,flag,
        row_number() over (PARTITION BY rowcn ORDER BY col desc) rn, rowcn  FROM temp 
    ) WHERE rn=1机器上没环境。。 试一下。。
      

  7.   

    可以简化下,order by的时候直接根据abs排序就可以了
    SQL> WITH tab AS(
      2  SELECT -100 col1,200 col2,-300 col3,50 col4,80 col5,-90 col6 FROM dual
      3  )
      4  select col from (
      5  select col,row_number()over(order by abs(col) desc) rn from (
      6  SELECT col1 col FROM tab UNION ALL
      7  SELECT col2 col FROM tab UNION ALL
      8  SELECT col3 col FROM tab UNION ALL
      9  SELECT col4 col FROM tab UNION ALL
     10  SELECT col5 col FROM tab UNION ALL
     11  SELECT col6 col FROM tab
     12  )
     13  ) where rn=1;
     
           COL
    ----------
          -300
     
    SQL> 
      

  8.   

    select col from tb where (select max(abs(col)) from tb)=abs(col)
      

  9.   

    感谢你们,,看看你们都是行转列的方式,感觉不好,因为我大概有200多列呢
    我自己想了一个办法,实现如下:
    select greatest(abs(-100),abs(-300) a,abs(200)),greatest(-100,-300,200) b from dual
    如果a=b 就表明b为最大值
    如果a<>b 就表明-a为最大值 (比如例子中的-300)找最小值的方法,还在探索中 
      

  10.   


    SQL> 
    SQL> with tb as
      2  (select -100 id1,200 id2,-300 id3 ,50 id4 ,80 id5, -90 id6 from dual),
      3  tb2 as
      4  (select rownum rn,id1 id from tb union all
      5  select rownum rn,id2 from tb union all
      6  select rownum rn,id3 from tb union all
      7  select rownum rn,id4 from tb union all
      8  select rownum rn,id5 from tb union all
      9  select rownum rn,id6 from tb)
     10  select id from tb2 where abs(id)=(select max(abs(id)) from tb2 group by rn)
     11  /
     
            ID
    ----------
          -300
      

  11.   

    select mi,
           mi_sign,
           case
             when mi = mi_sign then
              mi * -1
             else
              mi
           end as mi
      from (select least(abs(-150), abs(-300), abs(-50)) as mi,
                   least((sign(-150) + 2) * abs(150),
                         (sign(-300) + 2) * abs(300),
                         (sign(-50) + 2) * abs(50)) as mi_sign
              from dual)