Сложно, но важно правильно определить, что агрегатные функции должны выполнять при пропуске пустого набора.
Иногда это «интуитивно очевидно»: что такое СУММА без элементов?Ноль, я уверен, что все с готовностью скажут.
Иногда это не так: что такое ПРОДУКТ без элементов?Те, у кого есть математическая подготовка, быстро скажут «один», но это совсем не очевидно.
Тогда вы получите МИН, МАКС и вау!Как мы получили эти бесконечности?
Один из способов решить, что должна делать агрегирующая функция, - это рассмотреть, какое поведение мы хотим сохранить согласованным даже с пустыми наборами.Например, предположим, что у нас есть эти непустые наборы:
A = { 1, 2, 3 }
B = { 4, 5 }
Теперь это верно и для любых непустых наборов, что
SUM(A union B) = SUM(SUM(A), SUM(B))
15 = 6 + 9
PRODUCT(A union B) = PRODUCT(PRODUCT(A), PRODUCT(B))
120 = 6 * 20
MIN(A union B) = MIN(MIN(A), MIN(B))
1 = MIN(1, 4)
Не так лихорошо, говорят математики, если эти свойства остаются верными даже тогда, когда один или оба набора пусты?Это, безусловно, будет.
И это keepint это поведение, которое решает, какое значение мы присваиваем SOME_AGGREGATE_FUNCTION(empty-set)
:
Для
SUM(A union B) = SUM(SUM(A), SUM(B))
чтобы оставаться верным, когда A
пусто, а B
нет, мы должны иметь SUM(empty-set) = 0
, чтобы
PRODUCT(A union B) = PRODUCT(PRODUCT(A), PRODUCT(B))
оставалось верным, когда A
пусто иB
нет, мы должны иметь PRODUCT(empty-set) = 1
И наконец:
Чтобы
MIN(A union B) = MIN(MIN(A), MIN(B))
оставалось верным, когда A
пусто и B
- это не так, нам нужно, чтобы MIN(empty-set)
было значением, которое гарантированно больше любого возможного значения в B, чтобы оно не «мешало» результату MIN(B)
.И мы получаем наш ответ: MIN(empty-set) = positive infinity