Функции LOG и EXP
Функция LOG(x) возвращает натуральный логарифм выражения x. Результат имеет тип FLOAT.
Начиная с версии SQL Server 2012, эта функция приобрела необязательный аргумент, который задает основание логарифма.
SELECT LOG(2) ln, LOG(2, 10) log10;
[[ column ]] |
---|
[[ value ]] |
ln | log10 |
---|---|
0.693147 | 0.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;
[[ column ]] |
---|
[[ value ]] |
Функция EXP(x) - экспонента - возвращает число e в степени x. Тип возвращаемого значения FLOAT.
Эта функция является обратной к функции LOG:
SELECT EXP(LOG(2)) a, LOG(EXP(2)) b;
[[ column ]] |
---|
[[ value ]] |
a | b |
---|---|
2 | 2 |
Еще одно полезное свойство преобразования логарифмов - а именно, логарифм произведения равен сумме логарифмов сомножителей - позволит нам вычислить произведение значений в столбце таблицы, т.е.
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;
[[ column ]] |
---|
[[ value ]] |
log_prod | sum_log |
---|---|
4,24849524204936 | 4,24849524204936 |
Среди агрегатных функций SQL нет функции произведения значений. Тем не менее, используя вышеупомянутое свойство логарифмов и элементарные преобразования, мы можем свести эту задачу к вычислению суммы. Действительно,
a*b*c = exp(log(a*b*c)) = exp(log(a) + log(b) + log(c)).
Решение
SELECT EXP(SUM(LOG(rn))) FROM(
SELECT ROW_NUMBER() OVER(ORDER BY code) rn FROM laptop
) X;
[[ column ]] |
---|
[[ value ]] |
720 |
Рекомендуемые упражнения: 106