2016-01-25 59 views
1

我們正在測試兩組之間的差異,並在UNION/MINUS操作中看到一些違反直覺的行爲。這是什麼解釋?Teradata舍入錯誤,設置操作

如果您僅評估聯盟聲明的第一行(來源 - 目標),則會得到一個不匹配。這是正確的.-有0.000005的差異。

但是,如果您僅評估第二行,則不會返回任何記錄。這意味着Teradata在做Target-Source時將這兩個數字評估爲等同。

此外,當整個聯盟聲明運行時,您會得到2個不匹配!所以它確實認識到Target-Source也不相同。

1 + 0 = 2?即,兩組之間的聯合的基數不應該是基數的總和(忽略重複)。

還有另一個示例。


爲例進行說明:

WITH SOURCE_RESULT(TEST) AS (
    SELECT cast(.0296250 as decimal(10,7)) 
    ), 
    TARGET_RESULT(TEST) AS (
    SELECT cast(.02962 as decimal(10,5)) 
    ) 

    ((SELECT * FROM SOURCE_RESULT) MINUS (SELECT * FROM TARGET_RESULT)) 
    UNION 
    ((SELECT * FROM TARGET_RESULT) MINUS (SELECT * FROM SOURCE_RESULT)); 

例子2:

WITH SOURCE_RESULT(TEST) AS (
    SELECT cast(.0843090 as decimal(10,7)) 
    ), 
    TARGET_RESULT(TEST) AS (
    SELECT cast(.08431 as decimal(10,5)) 
    ) 

    ((SELECT * FROM SOURCE_RESULT) MINUS (SELECT * FROM TARGET_RESULT)) 
    UNION 
    ((SELECT * FROM TARGET_RESULT) MINUS (SELECT * FROM SOURCE_RESULT)); 

回答

0

我相信你在這裏看到的古怪行爲可以歸結爲在現場澆注作業的順序Teradata爲了執行設定的操作。

MINUS隨着Teradata的使用第一組的小數精度,所以在的情況下:

source MINUS target 

兩個sourcetarget被改變爲具有7:3的精度,然後發生MINUS設定操作。

當我們這樣做:

target MINUS source 

兩者都改爲5精度,從而導致兩個完全相同的數字,所以我們得到一個空的結果集

到目前爲止,這是相當預期的行爲。

當我們通過在UNION添加它複雜化,則結果的小數精度設置(並用於計算來創建它)由左上查詢確定的,這樣:

source MINUS target 
UNION 
target MINUS source 

結果所有4個初始字段都改爲小數精度7.然後兩個MINUS設置比較發生,最後是UNION。結果是底部的MINUS現在與精度7的十進制數進行比較,0.000005的差異現在影響結果。

作爲一個實驗,你可以在你的例子像一個倒置UNION

WITH SOURCE_RESULT(TEST) AS (
    SELECT cast(.0843090 as decimal(10,7)) 
    ), 
    TARGET_RESULT(TEST) AS (
    SELECT cast(.08431 as decimal(10,5)) 
    ) 

    ((SELECT TARGET_RESULT.* FROM TARGET_RESULT) MINUS (SELECT source_result.* FROM SOURCE_RESULT)) 
    UNION 
    ((SELECT SOURCE_RESULT.* FROM SOURCE_RESULT) MINUS (SELECT TARGET_RESULT.* FROM TARGET_RESULT)); 

在哪裏,現在我們正在做的:

target MINUS source 
UNION 
source MINUS target 

而且因爲一切都是四捨五入到5精密(左上角的字段爲DECIMAL(10,5)),您會收到一個空的結果集。 「

+0

」第一個SELECT語句中包含的數據類型,標題和格式子句確定出現在最終結果中的數據類型,標題和格式信息。「 見 http://www.info.teradata.com/HTMLPubs/DB_TTU_15_10/index.html#page/SQL_Reference/B035_1145_151K/attributes_of_a_set_result_ATTRIBUTES_SET_RESULT.html – dnoeth

+1

@dnoeth:非常好,在一組操作中的第一組確定模式。說得通。但是,它不是真的四捨五入嗎?它只是超過了5位十進制數字。其他方面,.00005應該圍起來,讓它們不同。 – foursuits

+0

Teradata支持兩種四捨五入方法,「圓到半到圓」和「從零開始圓整」,http://en.wikipedia.org/wiki/Rounding您的系統設置爲#1:http:// www。 info.teradata.com/HTMLPubs/DB_TTU_15_10/SQL_Reference/B035_1143_151K/Numeric_Types.031.64.html – dnoeth