2016-01-25 3 views
1

Мы тестируем разницу между двумя наборами и видим некоторое противоречивое поведение для округления в операциях UNION/MINUS. Каково объяснение этого?Ошибка округления Teradata, установка операций

Если вы оцениваете только первую строку утверждения Союза (Source-Target), вы получаете одно несоответствие. Это правильно. - Разница в .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 

Оба source и target изменены, чтобы иметь точность 7, а затем происходит операция MINUS множество.

Когда мы делаем:

target MINUS source 

Оба меняются с точностью до 5, что приводит к двух одинаковых номеров, так что мы получаем пустой результирующий набор

До сих пор это довольно ожидаемое поведение.

Когда мы усложнять, добавляя в UNION, то десятичная точность результирующего набора (и расчеты используются для его создания) определяется верхним левым запросом, так:

source MINUS target 
UNION 
target MINUS source 

Результатов в все 4 начальных поля сменились на десятичную точность 7. Затем выполняются два сравнения MINUS, затем, наконец, UNION. В результате дно MINUS теперь сравнивается с точностью 7 Десятичный и что .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: Отлично, первый набор в операции набора определяет схему. Имеет смысл. Однако, это не совсем округление? Это просто вырывает что-либо за пятой десятичной цифрой. Другой разумный .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

Смежные вопросы