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;
此查询使用子查询来:
或者,对于小型活动对于每个用户的行数有限的数据集,可以使用以下查询:
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中文网其他相关文章!