Автор: Joe Celko, Combinations, permutations, and derangements
Прежде чем перейти к вопросам баз данных, приведу тут несколько математических предварительных сведений.
Факториалы
Функция факториала обычно записывается как (n)!, и она определяется как произведение первых (n) натуральных чисел. Таким образом, 5! равно (5 · 4 · 3 · 2 · 1) = 120. Как обычно, ноль — это особый случай: 0! = 1, что можно доказать с помощью несколько иного определения факториала. Вместо определения через произведение определим его рекурсивно следующим образом: n! = CASE WHEN n = 0 THEN 1 ELSE n · (n-1)! END.
Показывая процесс шаг за шагом, рекурсия разворачивается так:
5! = 5 · 4!
4! = 4 · 3!
3! = 3 · 2!
2! = 2 · 1!
1! = 1 · 0!
Посмотрите на последний шаг рекурсии. Теперь разделите обе части на единицу, чтобы получить (1! / 1) = 0! или 1 = 0! Обратите внимание, что всё, что было сделано до сих пор, является процедурным, а не ориентированным на множества. Специалисты по реляционным СУБД предпочитают уходить от процедурного кода. Для остальной части этой статьи вы можете думать о n! как о количестве способов упорядочить (n) элементов множества в последовательность. Очевидно, если у вас есть один элемент, то у вас есть только один способ упорядочивания. Но точно так же, если у вас ноль элементов, вы также на этом закончили. Как существует только одно пустое множество, так существует и только одна пустая последовательность.
Да, можно определить факториалы для отрицательных чисел, мнимых чисел, гамма-функцию для действительных чисел и другие вещи. Если вы не студент-математик, вам совершенно не понадобятся эти изощрённые трюки. Поскольку SQL — это язык баз данных, а не вычислительный язык, возможно, вы захотите использовать поиск по таблице, а не это рекурсивное определение. Вы можете найти таблицу чисел от одного до ста для заполнения таблицы. Факториальная функция растёт очень быстро!
0! = 1
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5 040
8! = 40 320
9! = 362 880
10! = 3 628 800
11! = 39 916 800
12! = 479 001 600
Продолжить чтение "Сочетания, перестановки и беспорядочность"