2016-09-20 49 views
0

我有一個名爲SAXTION_EG下面的表中,並此表包含各種colulms其價值的外面有一個名叫列STR_RATE並在此columncontain值一樣選擇從具有柱最高位計數後小數

STR_RATE 
    1.11317 
    123.08546759 
    8.49111 

現在請告訴我的oracle查詢,我可以根據小數點來選擇最大值,例如在上面提到的情況下,值123.08546759具有最高的decinal count,所以它有8位數字在小數點後計數,因爲我的目標是獲取在十進制後具有最高數字的值

+1

什麼數據類型是str_rate,數字或VARCHAR2?如果它是varchar2(文本字符串),是否可以存在像1.00000000這樣的值 - 如果是這樣,那麼多少個十進制數字是0或8?最後,在關係情況下應該返回什麼(例如,有三個值,8位十進制數,8是最大值) - 返回所有三個值?如果不是,哪一個? – mathguy

回答

0

您可以嘗試一些像這樣。邏輯首先得到小數點的位置。然後獲取小數點後的字符串。之後,計算該子字符串中的字符數。然後使用MAX以獲得聚集的最大值

SELECT MAX(LENGTH(SUBSTR(STR_RATE, INSTR(STR_RATE, '.')+ 1))) 
FROM your_table 
+0

感謝您的回覆,但我仍然無法理解此查詢,請告知它如何在內部工作 – asderfgh

+0

基本上我只是將字符串函數應用於您的數據。請參閱此鏈接以瞭解有關oracle字符串函數的更多信息。 http://www.oradev.com/oracle_string_functions.html –

+0

我得到這個作爲返回類型的上述查詢763207461511537所以這意味着有一些價值的小數位後的值有價值763207461511537 – asderfgh

0

在下面的溶液中,我假定str_rate是數據類型數目,所以必須將其首先轉換爲字符。我添加了幾個樣本值來檢查正確處理整數值,並說明兩個值具有相同的最大小數位數的情況。在這種情況下,解決方案返回這兩個值(請參閱底部的結果集)。

with 
    saxtion_eg (str_rate) as (
     select 1.11317 from dual union all 
     select 123.08546759 from dual union all 
     select 8.49111 from dual union all 
     select 582   from dual union all 
     select 0.00000001 from dual 
    ), 
    prep (str_rate, char_rate, pos) as (
     select str_rate, to_char(str_rate), instr(to_char(str_rate), '.') 
     from saxtion_eg 
    ), 
    final (char_rate, dec_digits, max_dec_digits) as (
     select char_rate, 
       case pos when 0 then 0 else length(char_rate) - pos end, 
       max(case pos when 0 then 0 else length(char_rate) - pos end) over() 
     from prep 
    ) 
select char_rate as str_rate 
from final 
where dec_digits = max_dec_digits 
; 

STR_RATE        
---------------- 
123.08546759        
.00000001 
0

該查詢小數點而言返回的最大值:

select max(STR_RATE) keep (dense_rank last order by length(STR_RATE-trunc(STR_RATE))) 
from SAXTION_EG 
相關問題