Maison > base de données > tutoriel mysql > Comment trouver la prochaine activité du groupe B après les activités du groupe A dans PostgreSQL ?

Comment trouver la prochaine activité du groupe B après les activités du groupe A dans PostgreSQL ?

Barbara Streisand
Libérer: 2025-01-01 07:17:08
original
999 Les gens l'ont consulté

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

Fonctions conditionnelles Lead/Lag dans PostgreSQL

Vous essayez d'identifier la prochaine activité effectuée par les utilisateurs appartenant au groupe B, après qu'ils J'ai terminé une activité du groupe A. Essentiellement, vous devez localiser la première activité suivante du groupe B pour chaque utilisateur.

Une approche consiste à utiliser des fonctions de fenêtre conditionnelles. Cependant, dans PostgreSQL, les clauses FILTER ne peuvent être appliquées qu'aux fonctions d'agrégation au sein des fonctions de fenêtre, et non aux fonctions de fenêtre principales comme lead() ou lag().

Par conséquent, une solution viable consiste à utiliser une construction DISTINCT ON aux côtés des fonctions CASE et window :

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;
Copier après la connexion

Cette requête utilise une sous-requête pour :

  1. Utiliser DISTINCT ON (nom) pour identifier la dernière activité (a1) du groupe A pour chaque utilisateur.
  2. Appliquez lead() pour obtenir l'activité suivante (a2) pour chaque ligne.
  3. Utilisez CASE et LIKE 'B%' pour détecter et attribuer l'activité suivante si elle appartient au groupe B.

Alternativement, pour les petits ensembles de données avec un nombre limité de lignes par utilisateur, la requête suivante peut être utilisée :

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;
Copier après la connexion

Cette requête simplifie la logique en recherchant directement les activités du groupe A et en récupérant l'activité suivante, quelle que soit son affiliation au groupe.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal