Я пишу запрос снежинки, который вычисляет 1/2940744 и получает результат, равный 0 Как решить, чтобы получить фактический результат расчета?
Из документов:
При выполнении деления:
Старшие цифры для вывода представляют собой сумму старших цифр числителя и масштаба знаменателя.
Snowflake сводит к минимуму потенциальное переполнение на выходе (из-за цепного деления) и потерю масштаба, добавляя 6 цифр к шкале числителя, вплоть до максимального порога в 12 цифр, если только шкала числителя больше 12, в которой случае шкала числителя используется в качестве выходной шкалы.
Другими словами, предполагая операцию деления с числителем
L1.S1
и знаменателемL2.S2
, максимальное количество цифр в выводе вычисляется следующим образом:Масштаб
S = max(S1, min(S1 + 6, 12))
Если результат операции деления превышает масштаб вывода, Snowflake округляет вывод (а не усекает вывод).
Возвращаясь к примеру:
SELECT 1/2940744;
-- 0
DESC RESULT LAST_QUERY_ID();
Значение 0.00000034005
было округлено до 0. Чтобы изменить поведение, один из аргументов можно было явно привести:
SELECT 1::NUMBER(38,12)/2940744;
-- 0.00000034005
DESC RESULT LAST_QUERY_ID();
-- 1::NUMBER(38,12)/2940744 NUMBER(38,12)
@AdrianWhite Литералы 1/1.0/1.00 имеют один и тот же предполагаемый тип данных NUMBER(1,0)
. Если задействованы только нули, они игнорируются, SELECT 1, 1.0, 1.00, 1.001; DESCRIBE RESULT LAST_QUERY_ID(); -- NUMBER(1,0) NUMBER(1,0) NUMBER(1,0) NUMBER(4,3)
Спасибо за ответ выше, я поздно проверяю этот ответ и сам решаю вопрос, преобразуя результат в ::double
-> 1/5000000 :: double
Потрясающий ответ ... понятия не имел, что он только что добавил 6dp . Почему в этом примере игнорируются нули: select 1.1/2940744,1.0/2940744;