Как решить, что снежинка заставит очень маленький результат целочисленного деления обнулиться

Я пишу запрос снежинки, который вычисляет 1/2940744 и получает результат, равный 0 Как решить, чтобы получить фактический результат расчета?

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
0
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Из документов:

Дивизия

При выполнении деления:

  • Старшие цифры для вывода представляют собой сумму старших цифр числителя и масштаба знаменателя.

  • 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)

Потрясающий ответ ... понятия не имел, что он только что добавил 6dp . Почему в этом примере игнорируются нули: select 1.1/2940744,1.0/2940744;

Adrian White 17.01.2023 23:38

@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)

Lukasz Szozda 18.01.2023 08:18

Спасибо за ответ выше, я поздно проверяю этот ответ и сам решаю вопрос, преобразуя результат в ::double -> 1/5000000 :: double

Другие вопросы по теме