创建计算值的索引

时间:2015-07-12 11:14:15

标签: sql postgresql

sales的{​​{1}}记录year如下所示:

id year sales
1  2001 10
2  2002 20
3  2003 30

为了从一年到下一年获得sales_difference,我正在加入自己的桌子:

SELECT s1.*, s1.sales - s2.sales AS sales_difference
FROM sales s1, sales s2
WHERE s1.year = s2.year + 1

此查询运行速度非常慢,因此我想在year + 1上创建索引。根据{{​​3}},您可以在表达式上创建索引,例如:

CREATE INDEX test1_lower_col1_idx ON test1 (lower(col1));

所以我尝试这样做:

CREATE INDEX sales_year_plus_one on sales (year + 1);

给了我:

ERROR:  syntax error at or near "+"
LINE 1: ...sales_year_plus_one on sales (year + 1);
                                              ^

为什么不允许使用此特定表达式?

2 个答案:

答案 0 :(得分:5)

您需要将表达式括在一组额外的括号中:

jsoup 1.8.2

请参阅文档摘录:

  

CREATE INDEX命令的语法通常需要在索引表达式周围编写括号,如第二个示例所示。当表达式只是函数调用时,可以省略括号,如第一个示例所示。

答案 1 :(得分:4)

您还可以使用窗口函数来获得相同的效果,而无需额外的索引(因此维护该索引的开销):

SELECT *, sales - lag(sales) OVER (ORDER BY year) AS sales_difference
FROM sales;

您可能已经拥有的year上的简单索引就足够了。