Найдите максимальный масштаб и точность столбца с плавающей запятой

#sql #teradata #teradatasql

#sql #teradata #teradatasql

Вопрос:

У меня есть столбец с типом данных float в Teradata. Я хочу найти максимальную точность и масштаб для этого столбца.

Примечание: масштабная часть моего столбца содержит более 10 цифр в большинстве мест.

Примерные данные

 123.12321323002
13123213.13200003
33232.213123001
 

Вывод, который мне нужен, это
Точность 19 (масштаб длина 13123213), а масштаб равен 11 (длина 12321323002)
или

8 (длина 13123213), 11 (длина 12321323002).

Я попытался найти их, преобразовав столбец в varchar и разделив их на основе ‘.’ и сделать целочисленную и дробную части в виде 2 столбцов, а затем найти максимальную длину 2 столбцов. Но когда я выбираю данные, Teradata округляет масштабную часть. Так что после этого, если я преобразую их в char, я получаю меньшее значение для масштабной части.

Например:

данные организации: 1234.12312000123101

данные, когда я выбираю из Teradata: 1234.12312000123

Ответ №1:

Это немного длинновато для комментария.

Teradata использует формат IEEE для значений real / float. Это дает точность 15-17 цифр. Увы, вам нужно 19 цифр, поэтому нужные значения не сохраняются в базе данных. Вы не можете их восстановить.

Что вы можете сделать, так это исправить базу данных, чтобы она использовала numeric / decimal / number . Это поддерживает то, что вы хотите: NUMERIC(19, 11) . Затем вам нужно будет перезагрузить данные, чтобы они правильно хранились в базе данных.

Комментарии:

1. TL; DR — никогда не используйте float, проблемы перевешивают любые возможные выгоды.

2. @Andrew . , , Значения с плавающей запятой имеют место, когда диапазон значений превышает все, что может быть представлено в формате фиксированной длины. В реальных базах данных это требуется очень, очень редко. В бизнес-базах данных, возможно, никогда.

3. Достаточно справедливо. Я просто не могу смириться с непредсказуемостью, отсутствием гарантированной точности с плавающими числами. Но, может быть, это просто потому, что я немного помешан…

Ответ №2:

Если вам нужна высокая точность без предопределенного масштаба, просто переключитесь на NUMBER тип данных, который представляет собой смесь десятичной и плавающей.

Точное числовое значение, точность не менее 38 цифр, без предопределенного масштаба, диапазон 1E-130 .. 1E125.

Плавающий на стероидах 🙂