Задание оконных функций с объединениями в Postgres - PullRequest
0 голосов
/ 28 марта 2020

Я получаю синтаксическую ошибку с этой командой SQL в Postgres, но похоже, что она соответствует синтаксису команды, указанному в документации SELECT

select *, 
       row_number() over w 
from units 
   left outer join leases 
window w AS (partition by units.id order by leases.start desc)

Насколько далеко как я вижу, это соответствует синтаксису, который говорит, что я могу написать любой оператор SQL в форме:

SELECT * 
from (table joins) 
WINDOW window_name AS (window_definition)

, и все же SQL говорит мне, что есть ошибка между leases и window. В чем ошибка? Почему я неправильно читаю документацию?

Вот ошибка:

2020-03-27 23:02:11.644 PDT [47717] ERROR:  syntax error at or near "WINDOW" at character 66
2020-03-27 23:02:11.644 PDT [47717] STATEMENT:  select *, row_number() over w from  units left outer join leases WINDOW w AS (partition by units.id order by leases.start desc)
ERROR:  syntax error at or near "WINDOW"
LINE 1: ...umber() over w from  units left outer join leases WINDOW w A...
                                                             ^

Чтобы прояснить мой вопрос, я отредактировал его, чтобы фактически добавить функцию окна в список SELECT, хотя это не является необходимым согласно Postgresql SQL спе c. В любом случае, добавление функции не заботится о синтаксической ошибке; оно остается на том же месте.

Ответы [ 2 ]

1 голос
/ 28 марта 2020

Как прокомментировал hwnn, ваш sql не является ошибкой из-за того, что вы используете WINDOW, это потому, что вы не поставили никаких предикатов для объединения

select *, 
   row_number() over w 
from 
  units u
  left outer join leases l on u.id = l.unitid
  --                       ^^^^^^^^^^^^^^^^^^
window w AS (partition by u.id order by l.start desc)

Если вы стремитесь улучшить ваше sql знание, что вы можете пропустить использование предложения WINDOW, поскольку (насколько я знаю) оно поддерживается не всеми СУБД; Изучение синтаксиса, реализуемого только некоторыми поставщиками, когда доступен более распространенный вариант, неоправданно ограничивает вас

select *, 
   row_number() over (partition by u.id order by l.start desc) 
from
  units u
  left outer join leases l on u.id = l.unitid
0 голосов
/ 28 марта 2020

Что вы пытаетесь сделать? Вы не используете никаких оконных функций.

Таким образом, синтаксис просто:

select *
from units u left outer join
     leases l 
     on <join conditions here>

Предложение window будет использоваться, если у вас есть такая оконная функция, как row_number() с over предложение.

Вы можете добавить предложение window после предложение from:

select *,
       row_number() over w 
from units u left outer join
     leases l 
     on <join conditions here>
window w as (partition by u.id order by l.start desc);

Это не нужно, если вы не собираетесь ссылаться на него более одного раза, поэтому обычно используется:

select *,
       row_number() over (partition by u.id order by l.start desc)
from units u left outer join
     leases l 
     on <join conditions here>;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...