ホームページ > データベース > mysql チュートリアル > PostgreSQL でグループ A のアクティビティに続くグループ B の次のアクティビティを見つける方法

PostgreSQL でグループ A のアクティビティに続くグループ B の次のアクティビティを見つける方法

Barbara Streisand
リリース: 2025-01-01 07:17:08
オリジナル
1006 人が閲覧しました

How to Find the Next Activity of Group B Following Group A Activities in PostgreSQL?

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:

  1. DISTINCT ON (name) を使用して、各ユーザーのグループ A からの最新のアクティビティ (a1) を識別します。
  2. lead() を適用して、次のアクティビティ (a2) を取得します。
  3. CASE と LIKE 'B%' を使用して、グループに属している場合は次のアクティビティを検出して割り当てます。 B.

また、ユーザーごとの行数が制限された小規模なデータセットの場合は、次のクエリを使用できます。

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート