Найти тему

Мода и Медиана на SQL

Оглавление

Мой Телеграм

Давайте попробуем разобрать как на sql можно посчитать моду и медиану.

Мода

это значение, которое чаще других значений встречается в выборке. Выборка может быть одна или несколько мод. вообще на практике я редко встречал что бы на это значение как-то опирались. Мне кажется это больше теоретическая характеристика распределения. Но на собеседовании могут спросить про это, а иногда и попросить посчитать на обычном SQL

Предположим, есть некая таблица `users` и нам надо найти моду по столбцу `value`

-2

Тут я предполагаю, что не на надо объяснять, что такое CTE и как оно работает пока просто приведу полный код, а потом распишу что там происходит

-3

итак, `cte_1`, в нем сколько раз каждое значение встречается в колонке `value`

далее на основе `cte_1` строится `cte_2` где количество значений из `cte_1` ранжируется по убыванию. Тут стоит отметить что в выражении `over` не указано окно, а значит `rank()` будет выполнен по всему столбцу сразу

Ну и итоговый запрос просто отбирает из `cte_2` значение с наибольшим рангом. Стоит отметить, что если в выборке будет несколько значений которые встречаются одинаковой кол-во раз, то такой запрос выведет их все

Медиана


Теперь медиана, гораздо чаще встречающееся на практике чем мода. Про нее будут спрашивать на всех собесах в аналитику. Да и сам я, если доводиться вести собес обязательно спрошу, что это.  Грубо говоря, медиана — это такое значение в выборке при котором половина выборки будет меньше этого числа, а половина больше этого числа, формально медиан может быть бесконечное множество если в выборке четное кол-во чисел

и так, код на sql по все той же таблице

-4

что же тут происходит?

в `cte_1` мы нумеруем все строки упорядочив значения по возрастанию, а также считаем кол-во строк и кол-во строк + 1
Если рассматривать приведенную выше таблицу, то она будет выглядеть `cte_1` выглядит так

-5

При построении `сte_2` мы просто делим `cnt` и `cnt_1` на 2. А в последнем финальном запросе мы выбираем среднее значение между `c1` и `c2`

и да, тут четное число в выборке поэтому медианой можно считать любое число от 1010 до 1015. это я к тому, что numpy выдаст медиану 1012,5

в этом
ноутбуке можно поиграться со всем этим