【发布时间】:2018-11-01 09:40:56
【问题描述】:
我有一个 PostgreSQL 表,我们称之为 tokens,在文本行中包含每个标记的语法注释,基本上是这样的:
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
【问题讨论】:
标签: postgresql window-functions linguistics