Tengo una tabla customers con columnas birthdate::date y id::integer.

Recibo un error de sintaxis (ERROR: syntax error at or near "over") cuando ejecuto la siguiente consulta:

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;

Pero no cuando ajusto la primera línea a

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

No entiendo este comportamiento. ¿Qué causa el error?

Estoy usando PostgreSQL 9.6.6.

0
Bryan 13 nov. 2017 a las 04:00

2 respuestas

La mejor respuesta

over (order by age) no es un modificador de la expresión completa. lead(...) over(...) es una sola unidad, no puedes poner cosas al azar en el medio. Si desea poner la parte - age más adelante en la expresión, puede hacerlo, solo tiene que retroceder más de lo que intentó:

select lead(age, 1) over (order by age) - age as diff
2
user743382user743382 13 nov. 2017 a las 01:07

¿Por qué usarías una subconsulta para esto?

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;

No me sorprendería que también quisieras un partition by.

0
Gordon Linoff 13 nov. 2017 a las 01:59