Арифметические функции

Для всех арифметических функций в RQL тип результата вычисляется как минимальный числовой тип, который может вместить результат, если такой тип существует. Выбор минимального типа происходит с учётом числа бит, знаковости и "плавучести". Если минимальных бит не хватает, то используется тип с максимальной битностью.

Примеры использования:

SELECT toTypeName(0), toTypeName(0 + 0), toTypeName(0 + 0 + 0), toTypeName(0 + 0 + 0 + 0)

Результат:

┌─toTypeName(0)─┬─toTypeName(plus(0, 0))─┬─toTypeName(plus(plus(0, 0), 0))─┬─toTypeName(plus(plus(plus(0, 0), 0), 0))─┐
│ UInt8         │ UInt16                 │ UInt32                          │ UInt64                                   │
└───────────────┴────────────────────────┴─────────────────────────────────┴──────────────────────────────────────────┘

Арифметические функции работают для любой пары типов из UInt8, UInt16, UInt32, UInt64, Int8, Int16, Int32, Int64, Float32, Float64. Переполнение обрабатывается аналогично C++.

Использование функций multiplyDecimal и divideDecimal предпочтительнее в ситуациях, когда необходима высокая точность вычислений и контроль за размером дробной части. В то же время следует учитывать, что эти функции могут работать медленнее стандартных арифметических функций multiply и divide.

Набор поддерживаемых функций RQL и их поведение зависят от версии установленного ClickHouse. Если функция не поддерживается в используемой версии ClickHouse, она также не будет доступна в RQL. Ознакомиться с актуальным списком функций и их поведением можно в официальном репозитории ClickHouse, выбрав нужную версию из веток. Например: список арифметических функций для ClickHouse 24.7.

Table 1. Арифметические функции
Функция Описание

plus(a, b)

Вычисляет сумму чисел a и b. Поддерживает сложение целых чисел с датой и датой с временем, где прибавление к дате означает дни, а к дате с временем — секунды.

minus(a, b)

Вычисляет разность чисел a и b. Поддерживает вычитание целых чисел из даты и даты с временем, аналогично plus.

multiply(a, b)

Вычисляет произведение чисел a и b.

divide(a, b)

Вычисляет частное чисел a и b. Результат всегда с плавающей запятой. Для целочисленного деления используйте intDiv.

intDiv(a, b)

Вычисляет целочисленное частное чисел a и b с округлением вниз.

intDivOrZero(a, b)

Аналог intDiv, но возвращает ноль при делении на ноль или при определённых условиях переполнения.

modulo(a, b)

Вычисляет остаток от деления числа a на b. Результат целочисленный для целых чисел и с плавающей точкой, если хотя бы один из аргументов таковым является.

moduloOrZero(a, b)

Аналог modulo, но возвращает ноль при делении на ноль.

negate(a)

Вычисляет число, обратное по знаку к a.

abs(a)

Возвращает абсолютное значение числа a. Для беззнаковых типов ничего не изменяет.

gcd(a, b)

Вычисляет наибольший общий делитель чисел a и b.

lcm(a, b)

Вычисляет наименьшее общее кратное чисел a и b.

max2(value1, value2)

Сравнивает числа value1 и value2, возвращая максимальное значение. Результат приводится к Float64.

min2(value1, value2)

Сравнивает числа value1 и value2, возвращая минимальное значение. Результат приводится к Float64.

multiplyDecimal(a, b[, result_scale])

Умножает два числа типа Decimal, позволяя контролировать размер дробной части результата через result_scale.

divideDecimal(a, b[, result_scale])

Делит два числа типа Decimal, позволяя контролировать размер дробной части результата через result_scale.