窗口框架中的前N个值

时间:2017-04-25 02:51:47

标签: postgresql

我有一个包含3个感兴趣领域的表格: d(日期),pid(int)和分数(数字)

我正在尝试计算第4个字段,该字段是每个玩家在当前行前几天的前N(3或5)分数的平均值。

我在子查询上尝试了以下连接,但它没有产生我正在寻找的结果:

SELECT t.d, t.pid, t.score, sq.highscores 
FROM t, (SELECT *, avg(score) as highscores FROM
   (SELECT *, row_number() OVER w AS rnum
    FROM t AS t2
    WINDOW w AS (PARTITION BY pid ORDER BY score DESC ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING)) isq
    WHERE rnum <= 3) sq
WHERE t.d = sq.d AND t.pid = sq.pid

任何建议都将不胜感激!我是一个业余爱好者程序员,这比我以前的查询更复杂。

1 个答案:

答案 0 :(得分:1)

您无法在同一(内部)查询中选择* avg(score)。即应该为每个平均值选择哪些非聚合值? PostgreSQL不会决定这个而不是你。

在最里面的查询中,您应该PARTITION BY pid,您应该在聚合子查询中使用GROUP BY pid。这样,你可以SELECT pid, avg(score) as highscores

SELECT   pid, avg(score) as highscores
FROM     (SELECT *, row_number() OVER w AS rnum
          FROM t AS t2
          WINDOW w AS (PARTITION BY pid ORDER BY score DESC)) isq
WHERE    rnum <= 3
GROUP BY pid

注意ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDINGrow_number()没有任何影响。

但是如果 top N 部分是固定的(并且N在您的实际用例中也很少),您可以在没有那么多子查询的情况下解决这个问题(使用{{1}窗函数):

nth_value()

http://rextester.com/GUUPO5148

相关问题