POSTGRESQL: средневзвешенное значение вместо среднего? - PullRequest
1 голос
/ 13 марта 2020

У меня есть список средних значений

SELECT tv.id, AVG(ut.rating) FROM user_tvshow AS ut
LEFT JOIN tvshows AS tv ON tv.id = ut.tvshow
WHERE "user" IN (
    SELECT follows FROM user_follows WHERE "user" = 1   -- List of users the current user follows
) AND rating IS NOT NULL GROUP BY tv.id;

На данный момент он усредняет результаты, как и ожидалось. Можно ли как-то взвесить это среднее с количеством строк в группе? Таким образом, одна строка рейтинга 10 не будет отображаться выше, чем 100 строк рейтинга 9.

1 Ответ

2 голосов
/ 13 марта 2020

Это не средневзвешенное значение. Звучит так, как будто вы пытаетесь достичь среднего по Байесу , где вы штрафуете небольшой набор, смещая наблюдаемое среднее к некоторому мета-среднему. Не существует встроенного способа сделать это в PostgreSQL.

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

select id, (the_sum + 10* <metaaveerage>)/(the_count+10) from (
    SELECT tv.id, sum(ut.rating) as the_sum, count(ut.rating) as the_count FROM user_tvshow AS ut
    LEFT JOIN tvshows AS tv ON tv.id = ut.tvshow
    WHERE "user" IN (
       SELECT follows FROM user_follows WHERE "user" = 1   -- List of users the current user follows
    ) AND rating IS NOT NULL GROUP BY tv.id
) foobar

Как вы решаете, какие значения подключать для 10 и для <metaaverage> это вопросы статистики, а не программирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...