2017-06-12 87 views
1

说我有这个表,是否可以对同一列但不同行的值进行数学运算?

year |  name  | score 
------+---------------+---------- 
2017 | BRAD   | 5 
2017 | BOB   | 5 
2016 | JON   | 6 
2016 | GUYTA   | 2 
2015 | PAC   | 2 
2015 | ZAC   | 0 

我将如何去通过平均每年的分数,然后让年之间的区别?

year | increase 
------+----------- 
2017 | 1 
2016 | 3 
+0

请** [编辑] **你的问题,并添加基于您的样本数据的预期输出。 [**格式化文本**](http://stackoverflow.com/help/formatting)请,[**没有屏幕截图**](http://meta.stackoverflow.com/questions/285551/why-may -i-不上传图像-的代码上那么当灰化-A-问题/ 285557#285557)。 –

+0

@a_horse_with_no_name我做了一些更改/编辑;对于先前的问题抱歉(第一次使用堆栈,并没有意识到我的问题是非常不清楚) – 374

回答

2

您应该使用window functionlead()在这种情况下:

select year, avg, (avg - lead(avg) over w)::int as increase 
from (
    select year, avg(score)::int 
    from my_table 
    group by 1 
    ) s 
window w as (order by year desc); 

year | avg | increase 
------+-----+---------- 
2017 | 5 |  1 
2016 | 4 |  3 
2015 | 1 |   
(3 rows) 
+0

这是非常有用的(我简化了一些数据,但这对我的原始设置非常有效),非常感谢! – 374

+0

这可能是一个愚蠢的问题,但在from()语句的末尾是什么? – 374

+0

FROM中的子查询必须有别名 - 这是别名。 – klin

相关问题