Почему функция Postgres «mode» так отличается от «avg», «max» и других агрегатов?

#postgresql #syntax #statistical-mode

#postgresql #синтаксис #статистический режим

Вопрос:

В Postgres я могу сказать select avg(size) from images и select max(size) from images .

Но когда я хочу mode , я могу этого не делать:

 select mode(uploaded_by_id) from images
 

Вместо этого я должен сделать это:

 select mode() within group (order by uploaded_by_id desc) from images
 

Синтаксис кажется мне немного странным. Кто-нибудь знает, почему другой синтаксис не был разрешен?

ПРИМЕЧАНИЕ: я знаю, что разрешение order by позволяет пользователю определять, какой режим использовать в случае привязки, но я не понимаю, почему это должно полностью запрещать другой синтаксис.

Спасибо!

Ответ №1:

Не существует «машинной формулы» для вычисления режима, как для других вещей. Для min или max вы просто отслеживаете минимальное или максимальное значение, которое видели до сих пор. Например, для среднего значения вы можете просто отслеживать сумму и количество, увиденные до сих пор. С режимом вам нужно иметь все данные под рукой.

Использование агрегата с упорядоченным набором автоматически обеспечивает такой вариант использования, включая буферизацию данных во временные файлы на диске по мере их увеличения.

Вместо этого вы могли бы написать код для объединения данных в память, а затем обработать его оттуда (как указано в других ссылках на ответы), но это стало бы медленным и подверженным сбоям, поскольку объем необходимой памяти начинает превышать доступный объем.

Ответ №2:

После просмотра документации кажется, что они отошли от простой функции в пользу функции window, они ссылаются на преимущества скорости в качестве причины для этого.

https://wiki.postgresql.org/wiki/Aggregate_Mode

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