获取每组中列值的中位数

Getting median of column values in each group

我有一个 table 包含 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));

不过,这似乎是 return 所有评级的中值。如何按 user_id 对其进行分组,以便我可以看到每个用户的平均评分?

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

这不容易实现,因为 SQLite 不允许相关子查询引用 LIMIT/OFFSET 子句中的外部值。

user_id 的 WHERE 子句添加到所有三个子查询中,并针对每个用户 ID 执行它们。

下面给出了要求的中位数:

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
;

逻辑通俗易懂,但代码没有美化。如果有鼓励或意见,我会改进它。简而言之,诀窍是使用 SQLite 的 rowid