首页 > 数据库 > mysql教程 > 如何在 PostgreSQL 中查找 A 组活动之后 B 组的下一个活动?

如何在 PostgreSQL 中查找 A 组活动之后 B 组的下一个活动?

Barbara Streisand
发布: 2025-01-01 07:17:08
原创
1069 人浏览过

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

PostgreSQL 中的条件超前/滞后函数

您正在尝试识别属于 B 组的用户执行的下一个活动,之后已完成 A 组的一项活动。本质上,您需要为每个组找到 B 组的第一个后续活动user.

一种方法是利用条件窗口函数。然而,在 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;
登录后复制

此查询使用子查询来:

  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中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板