У меня есть таблица PostgreSQL, назовем ее токены , содержащие грамматические аннотации на токен в строках текста, в основном так:
idx | line | tno | token | annotation | lemma
----+------+-----+---------+-----------------+---------
1 | I.01 | 1 | This | DEM.PROX | this
2 | I.01 | 2 | is | VB.COP.3SG.PRES | be
3 | I.01 | 3 | an | ART.INDEF | a
4 | I.01 | 4 | example | NN.INAN | example
Я хочу сделать запрос, который позволяет мне искать грамматические контексты, в данном случае запрос, который проверяет, присутствует ли определенная аннотация в окне размером n до и после текущей строки , Из того, что я прочитал об этом, оконные функции PostgreSQL LEAD
и LAG
подходят для этого. Сначала я написал следующий запрос на основе документации, которую смог найти об этих функциях:
SELECT *
FROM (
SELECT token, annotation, lemma,
-- LAG(annotation) OVER prev_rows AS prev_anno, -- ?????
LEAD(annotation) OVER next_rows AS next_anno
FROM tokens
WINDOW next_rows AS (
ORDER BY line, tno ASC
ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING
)
ORDER BY line, tno ASC
) AS "window"
WHERE
lemma LIKE '...'
AND "window".next_anno LIKE '...'
;
Однако, это только поиск в 2 следующих строках. У меня вопрос, как я могу перефразировать запрос, чтобы окно включало в таблицу как предыдущие, так и последующие строки? Очевидно, я не могу иметь 2 WINDOW
заявлений или делать что-то вроде
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
AND ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING