0

私は Postgres でのクエリに行き詰まっており、かなりイライラしています。私は3つの列を持つスコアと呼ばれるテーブルを持っています:

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 つのジョブを制限するより良い方法はありますか?

4

1 に答える 1

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。見る:

于 2013-11-11T11:11:40.063 に答える