比較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中文網其他相關文章!