|
Умножение записей - multiply
|
|||
---|---|---|---|
#18+
Для решения одной специфической задачи мне пришлось группировать записи и умножить значения, а не просуммировать. Дело в том, что существует агрегатная функция суммирования (SUM), а вот умножения (Multiply) – нет. Как быть? Чтобы решить данную задачу можно придумать функцию, можно также воспользоваться курсором. Но такие методы, как правило, работают медленно, если речь о большом количестве записей. На просторах интернета я встретил самую необычную и изящную идею. Тот, кто додумался до этого, просто гений! Я бы сам никогда не додумался. Метод настолько очаровал меня, что я решил поделиться им. Оказывается агрегатной функции SUM вполне достаточно! Но вот только придётся изощряться. Дело в том, что сумма логарифмов с одинаковым основанием равняется как раз таки логарифму точно с таким основанием, но с умножением значений. Т.е.: LN(A1) + LN(A2) + … + LN(An) = LN(A1*A2*…*An) Чтобы избавиться от логарифма полученное таким образом значение потом нужно будет воздвигать в степень e. Правда тут есть нюансы: все умножаемые числа должны быть больше 0, а для этого придётся брать только абсолютное значение и параллельно вести учёт знаков. Ну и в случае нулевого значения добавить «костыль». Пример: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
Выражение « POWER(-1, (SUM(CASE WHEN N.VAL<0 THEN 1 ELSE 0 END))) » необходимо чтобы следить за знаком (в случае если окажется отрицательное число). Выражение « MIN(CASE WHEN N.VAL=0 THEN 0 ELSE 1 END) » необходимо для выяснения нет ли 0 среди умножаемых значений. Если Вы точно знаете, что все умножаемые значения больше нуля, то и текст запроса будет проще. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
P.S. Конечно же при этом нужно учесть, что если умножаемых чисел слишком много или же сами числа достаточно огромные, то может возникнуть ошибка переполнения. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2020, 08:10 |
|
Умножение записей - multiply
|
|||
---|---|---|---|
#18+
studieren На просторах интернета я встретил самую ... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2020, 08:24 |
|
Умножение записей - multiply
|
|||
---|---|---|---|
#18+
studieren Метод настолько очаровал меня, что я решил поделиться им. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2020, 08:26 |
|
Умножение записей - multiply
|
|||
---|---|---|---|
#18+
-2-, Sorry. Я лично не видел этот топик раньше, хотя предварительно конечно же пользовался поиском. Стало быть плохо искал. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2020, 08:33 |
|
Умножение записей - multiply
|
|||
---|---|---|---|
#18+
studieren, studierenЧтобы решить данную задачу можно придумать функцию, можно также воспользоваться курсором. Но такие методы, как правило, работают медленно, если речь о большом количестве записей. Для данного форума это на 100% ложное утверждение. именно со специализированной пользовательской агрегатной функцией и работать будет удобнее, и работать она будет гарантированно быстреe, по крайней мере на типе number. Просто попробуй переписать это для случая применения в качестве аналитической функции - и так куча скобок, а получится не читаемая кракозябра. А вообще, имхо, такого рода штуки сами по себе не интересны, без воодушевляющего примера практически полезного использования. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2020, 11:57 |
|
|
start [/forum/topic.php?fid=52&msg=39927890&tid=1881549]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
53ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
2ms |
others: | 16ms |
total: | 161ms |
0 / 0 |