比较 PostgreSQL 中的行:利用窗口函数
在 PostgreSQL 中,检索涉及与相邻行比较的查询结果需要定制的解决方案。在这里,我们探讨如何有效地完成此任务:
奇数和偶数邻居之间的比较
要提取夹在偶数之间的奇数,可以设计一个自定义解决方案使用复杂的子查询。然而,PostgreSQL 的窗口函数提供了一种更有效的方法。 lag() 和 Lead() 函数可用于分别检索前一行和后一行的值,从而可以在由 textBlockId 和句子定义的窗口分区内进行直接比较。
扩展用例
在涉及分类的扩展场景中,此技术可用于定位出现在特定类别 NAME 的实例之间的单词,同时排除该类别的单词
使用窗口函数实现
以下代码片段演示了如何使用窗口函数来解决该问题:
SELECT textcat.text FROM ( SELECT text, category, chartype, lag(category,1) OVER w as previousCategory, lead(category,1) OVER w as nextCategory FROM token t, textBlockHasToken tb WHERE tb.tokenId = t.id WINDOW w AS ( PARTITION BY textBlockId, sentence ORDER BY textBlockId, sentence, position ) ) tokcat WHERE 'NAME' = ANY(previousCategory) AND 'NAME' = ANY(nextCategory) AND 'NAME' <> ANY(category)
或者,的简化版本查询:
SELECT text FROM ( SELECT text ,category ,lag(category) OVER w as previous_cat ,lead(category) OVER w as next_cat FROM token t JOIN textblockhastoken tb ON tb.tokenid = t.id WINDOW w AS (PARTITION BY textblockid, sentence ORDER BY position) ) tokcat WHERE category <> 'NAME' AND previous_cat = 'NAME' AND next_cat = 'NAME';
窗口函数的优点
窗口函数提供了几个优点:
以上是PostgreSQL 窗口函数如何有效比较相邻行?的详细内容。更多信息请关注PHP中文网其他相关文章!