Функции LOG и EXP

Функция LOG(x) возвращает натуральный логарифм выражения x. Результат имеет тип FLOAT.

Начиная с версии SQL Server 2012, эта функция приобрела необязательный аргумент, который задает основание логарифма.

SELECT LOG(2) ln, LOG(2, 10) log10;
mssql
🚫
[[ error ]]
[[ column ]]
[[ value ]]
lnlog10
0.6931470.30103

Этот запрос возвращает натуральный и десятичный логарифмы числа 2.

Имеется также унаследованная функция LOG10(x), возвращающая десятичный логарифм выражения x. Она изначально являлась избыточной, ввиду известной формулы преобразования логарифмов:

LOGba = LOGca/LOGcb

Соответственно три следующих выражения дадут один и тот же результат (0.301029995663981):

SELECT LOG(2,10) log_1, LOG10(2) log_2, LOG(2)/LOG(10) log_3;
mssql
🚫
[[ error ]]
[[ column ]]
[[ value ]]

Функция EXP(x) - экспонента - возвращает число e в степени x. Тип возвращаемого значения FLOAT.

Эта функция является обратной к функции LOG:

SELECT EXP(LOG(2)) a, LOG(EXP(2)) b;
mssql
🚫
[[ error ]]
[[ column ]]
[[ value ]]
ab
22

 Еще одно полезное свойство преобразования логарифмов - а именно, логарифм произведения равен сумме логарифмов сомножителей - позволит нам вычислить произведение значений в столбце таблицы, т.е.

log(a*b*c) = log(a) + log(b) + log(c).

В справедливости данного свойства мы можем легко убедиться на примере:

SELECT LOG(2*5*7) log_prod,  LOG(2) + LOG(5) + LOG(7) sum_log;
mssql
🚫
[[ error ]]
[[ column ]]
[[ value ]]
log_prodsum_log
4,248495242049364,24849524204936

Среди агрегатных функций SQL нет функции произведения значений. Тем не менее, используя вышеупомянутое свойство логарифмов и элементарные преобразования, мы можем свести эту задачу к вычислению суммы. Действительно,

a*b*c = exp(log(a*b*c)) = exp(log(a) + log(b) + log(c)).
Вычислить факториал числа, равного количеству строк в таблице Laptop.

Решение

SELECT EXP(SUM(LOG(rn))) FROM(
SELECT ROW_NUMBER() OVER(ORDER BY code) rn FROM laptop
) X;
mssql
🚫
[[ error ]]
[[ column ]]
[[ value ]]
720

Рекомендуемые упражнения: 106