PostgreSQL の条件付きリード/ラグ関数
グループ B に属するユーザーがその後に実行する次のアクティビティを特定しようとしています。グループ A のアクティビティが完了しました。基本的に、それぞれのグループ B から最初の後続のアクティビティを見つける必要があります。 user.
1 つのアプローチは、条件付きウィンドウ関数を利用することです。ただし、PostgreSQL では、FILTER 句はウィンドウ関数内の集計関数にのみ適用でき、lead() や lag() などのコア ウィンドウ関数には適用できません。
したがって、実行可能な解決策は、DISTINCT ON 構造を使用することです。 CASE およびウィンドウ関数と併用:
SELECT name , CASE WHEN a2 LIKE 'B%' THEN a1 ELSE a2 END AS activity , CASE WHEN a2 LIKE 'B%' THEN a2 END AS next_activity FROM ( SELECT DISTINCT ON (name) name , lead(activity) OVER (PARTITION BY name ORDER BY time DESC) AS a1 , activity AS a2 FROM t WHERE (activity LIKE 'A%' OR activity LIKE 'B%') ORDER BY name, time DESC ) sub;
このクエリはサブクエリを使用しますto:
また、ユーザーごとの行数が制限された小規模なデータセットの場合は、次のクエリを使用できます。
SELECT name , activity AS a1 , lead(activity) OVER (PARTITION BY name ORDER BY time DESC) AS next_activity FROM t WHERE (activity LIKE 'A%' OR activity LIKE 'B%') ORDER BY name, time DESC;
このクエリは、次のクエリを直接検索することでロジックを簡素化します。グループ A のアクティビティを実行し、そのグループへの所属に関係なく、後続のアクティビティを取得します。
以上がPostgreSQL でグループ A のアクティビティに続くグループ B の次のアクティビティを見つける方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。