我被 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 个作业?
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
。参见: