为什么我的over子句附近会出现语法错误?

时间:2017-11-13 01:00:42

标签: sql postgresql

我有一个customers表,其中包含birthdate::dateid::integer列。

运行以下查询时出现语法错误(ERROR: syntax error at or near "over"):

select lead(age, 1) - age over (order by age) as diff
  from customers
  join (select id,
               extract(year from age(birthdate))::integer as age
          from customers) as sub
        on customers.id = sub.id
order by age;

但不是在我将第一行调整到

select (-age) + lead(age, 1) over (order by age) as diff

我不明白这种行为。导致错误的原因是什么?

我正在使用PostgreSQL 9.6.6。

2 个答案:

答案 0 :(得分:2)

over (order by age)不是完整表达式的修饰符。 lead(...) over(...)是一个单位,你不能在它们之间放置随机的东西。如果你想稍后将- age部分放在表达式中,你可以,你只需要将它移回到你所尝试的范围之外:

select lead(age, 1) over (order by age) - age as diff

答案 1 :(得分:0)

为什么要为此使用子查询?

select lead(age) over (order by age) as diff - age 
from (select c.*, extract(year from age(birthdate))::integer as age
      from customers
     ) c
order by age;

如果您想要partition by,我也不会感到惊讶。