在Postgres中,如何计算每个用户最新5个分数的平均值?

问题描述 投票:0回答:1

我被 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 个作业?

sql postgresql aggregate-functions window-functions
1个回答
1
投票

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
。参见:

© www.soinside.com 2019 - 2024. All rights reserved.