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)
あるいは、簡略化されたバージョンquery:
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 中国語 Web サイトの他の関連記事を参照してください。