在Postgres中,我如何平均每位用户的最新5分?

时间:2013-11-11 09:21:53

标签: sql postgresql aggregate-functions window-functions

我陷入了Postgres的一个问题,我感到非常沮丧。我有一个名为得分的表,有三列:

score, user_id and date

我想让所有用户的平均得分超过5分。这个查询并没有让我明白:

SELECT user_id, 
       ROUND( AVG( score )::numeric, 2) as sc_avg
FROM 
(SELECT ROW_NUMBER() OVER (PARTITION BY user_id) AS r,
    sc.*
    from mg.scores sc
WHERE score IS NOT NULL
ORDER BY date DESC) AS x
WHERE x.r >= 5
GROUP BY user_id;

是否有更好的方法来限制每个用户的最后5个作业?

1 个答案:

答案 0 :(得分:1)

正如a_horse评论的那样, ORDER BY 子句必须进入窗口函数。
由于您的订单降序,因此需要< = 而不是> =

SELECT user_id, round(avg(score)::numeric, 2) AS sc_avg
FROM  (
   SELECT *
        , row_number() OVER (PARTITION BY user_id ORDER BY date DESC) AS rn
   FROM   mg.scores
   WHERE  score IS NOT NULL
   ) AS x
WHERE  x.rn <= 5
GROUP  BY user_id;

如果date可以是NULL,请使用ORDER BY date DESC NULLS LAST。参见: