2013-11-11 1 views
0

Я застрял в запросе в Postgres, и я очень расстроен. У меня есть таблица под названием «Оценки с тремя колонками»:В Postgres, как я могу усреднить последние 5 баллов за пользователя?

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 заданий на пользователя?

+5

Вы должны добавить 'ORDER BY даты DESC' к' над() 'пункта, в противном случае row_number() не возвращает то, что вы думаете (кстати:' date' является * ужасным * именем для столбца) –

ответ

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. См: