select count (*) / (extract( minute from (max(b) - min(b)))  *60 +  extract(second from( max(b) - min (b))))  row_per_second,
   extract( minute from (max(b) - min(b)))  *60 +  extract( second from(max (b) - min(b))) as  sec,
        count(*) rowCnt,
       max(b),
       min(b)  
  from jackTestIO;如上,意思大概能直接看懂吧.
我的问题是,(extract( minute from (max(b) - min(b)))  *60 +  extract(second from( max(b) - min (b)))) 这个语句出现了2次,有什么办法把这段表达优化成一个,其他地方直接引用这个值就好了.
要求: 表达明了,语句简洁, 计算高效. 不要用begin,end,declear 什么的,oracle性能优化

解决方案 »

  1.   

    如果要从日期类型的字段中抽取时/分部分用to_char() 函数就可以.比如to_char(sysdate,'hh24')抽取小时抽取小时
     
    SQL> select to_char(sysdate,'hh24') from dual;
     
    TO_CHAR(SYSDATE,'HH24')抽取分钟
     
    SQL> select to_char(sysdate,'mi') from dual;
     
    TO_CHAR(SYSDATE,'MI')抽取秒
     
    SQL> select to_char(sysdate,'ss') from dual;
     
    TO_CHAR(SYSDATE,'SS')
      

  2.   

    写个子查询呗select rowCnt / sec, t.*
      from (select extract(minute from(max(b) - min(b))) * 60 +
                   extract(second from(max(b) - min(b))) as sec,
                   count(*) rowCnt,
                   max(b),
                   min(b)
              from jackTestIO) t;
      

  3.   


    大哥明顯木有讀懂sql語句.
    首先我的計算是要把時間差轉為秒. 如果2m10s要轉為60*2+10,而 TO_CHAR(SYSDATE,'SS')最大只有59.其次我的時間不是sysdate,而是 時間差.
      

  4.   

    3L正式我想要的.想來這麼簡單的要求,sql一定有辦法做到,只是我學藝不精,自己不知道罷了.其實3L頭像也不錯的.