PostgreSQL代码末尾的额外FROM weeks是否错误?求运行逻辑解析
关于PostgreSQL代码中重复
FROM weeks的问题解析 这段代码里末尾的第二个FROM weeks是语法错误,PostgreSQL的SELECT语句不允许出现两个FROM子句,直接运行会报错。
原代码的意图与修正后的正确写法
原代码想要实现的是统计用户注册后0-3周内,每周的回访用户数量(即注册后对应周内有操作行为的用户数)。修正后的正确代码应该去掉重复的FROM weeks:
WITH weeks AS ( SELECT make_interval(weeks => n) as week from generate_series(0, 3) AS n ) SELECT week, count(x.user_email) as "Returning Users" FROM weeks LEFT JOIN ( SELECT act.user_email, age(act.timestamp, acc.timestamp) as diff FROM accounts acc JOIN action act on act.user_email = acc.user_email ) x ON x.diff >= week and x.diff < week + '1 week'::interval GROUP BY week;
运行逻辑说明
- 生成周时间区间:
weeks公共表表达式通过generate_series(0,3)生成0到3的整数,再转换为周级时间间隔,得到0 weeks、1 weeks、2 weeks、3 weeks这4个区间标识。 - 计算用户行为时间差:子查询
x关联用户注册表accounts和操作行为表action,算出每个用户每次操作与注册时间的间隔diff。 - 分组统计回访用户:外层用
weeks左联子查询x,匹配时间差diff落在[week, week+1周)区间内的记录,最后按week分组,统计每个周区间内的回访用户数(左联后无匹配的记录会被count(x.user_email)忽略,即该周无回访用户时统计结果为0)。
内容的提问来源于stack exchange,提问作者Nguyen Bang
相关产品推荐
相关产品推荐

