2016-02-15 2 views
2

У меня есть таблица, содержащая user_id, movie_id, рейтинг. Это все INT, а рейтинги варьируются от 1 до 5.Получение медианы значений столбцов в каждой группе

Я хочу получить средний рейтинг и сгруппировать его по user_id, но у меня есть некоторые проблемы с этим.

Мой код на данный момент:

SELECT AVG(rating) 
FROM (SELECT rating 
     FROM movie_data 
     ORDER BY rating 
     LIMIT 2 - (SELECT COUNT(*) FROM movie_data) % 2 
     OFFSET (SELECT (COUNT(*) - 1)/2 
       FROM movie_data)); 

Однако, это, кажется, возвращает среднее значение всех оценок. Как я могу сгруппировать это по user_id, так что я могу увидеть средний рейтинг для пользователя?

ответ

0

Ниже дается необходимая медиана:

DROP TABLE IF EXISTS movie_data2; 
CREATE TEMPORARY TABLE movie_data2 AS 
SELECT user_id, rating FROM movie_data order by user_id, rating; 

SELECT a.user_id, a.rating FROM (
SELECT user_id, rowid, rating 
FROM movie_data2) a JOIN (
SELECT user_id, cast(((min(rowid)+max(rowid))/2) as int) as midrow FROM movie_data2 b 
GROUP BY user_id 
) c ON a.rowid = c.midrow 
; 

Логика проста, но код не украсил. Учитывая поощрение или комментарии, я улучшу его. Вкратце, трюк заключается в использовании rowid SQLite.

+0

Спасибо за ответ. Правильно ли я полагаю, что 'a.user_id' использует идентификатор строки? Не могли бы вы вкратце объяснить, что это позволяет нам делать? Кроме того, это создает некоторые дубликаты, то есть пользователь имеет более чем один средний рейтинг. Можете ли вы объяснить, почему это так? Пример вывода pastebin: http://pastebin.com/9fvih7Q2 –

+0

'rowid' используется как номер строки, но на самом деле он фиксируется при создании таблицы. Итак, действительно, в коде произошла ошибка, я попытался ее исправить, используя новую таблицу TEMPORARY. Попробуйте снова? –

+0

Это отлично работает, спасибо! –

-1
SELECT user_id,AVG(rating) 
FROM movie_data 
GROUP BY user_id 
ORDER BY rating 
+1

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

+1

Спасибо за ответ, но насколько мне известно, функция AVG возвращает среднее значение, а не медианное. –

0

Это не так легко возможно потому, что SQLite не позволяет коррелированные подзапросы для обозначения внешних значений в LIMIT/OFFSET положения.

Добавить WHERE предложения для user_id ко всем трем подзапросам и выполнить их для каждого идентификатора пользователя.

 Смежные вопросы

  • Нет связанных вопросов^_^