编写RFM计算SQL遇语法错误:第23行期望'('/','/SELECT却遇标识符rfm
报错修复方案
核心错误原因
WITH语句定义多个公共表表达式(CTE)时,多个CTE之间必须用英文逗号分隔,你在第一个CTE combinedtable 结束的右括号后没有添加逗号,直接开始定义第二个CTE rfm,因此SQL解析器在第23行遇到rfm标识符时无法识别,直接抛出语法错误。
其他附带错误修正点
- 第一个CTE的关联子查询中直接引用了外层查询的别名
maintable,子查询内部无法识别该别名,需要替换为原始表路径 - 第一个CTE的SELECT字段中引用的关联表别名、字段名与实际定义不匹配,需要统一别名规则
- 第二个CTE中使用的日期函数名错误,需要替换为标准日期函数
- 第二个CTE的聚合逻辑错误,RFM指标是按用户维度聚合,不需要按计算出的recency字段分组
修正后完整SQL代码
with combinedtable as ( -- 从主数据表获取用户ID、配送日期、消费金额 select maintable.Customer_id, maintable.Delivery_Date, recentCDelivery_Date.recent_CDelivery_Date, sum(maintable.Subtotal) as Subtotal, count(maintable.Customer_id) as totalevents from `piattosteakhouse.ALFACO.Ordering_Co_Orders` as maintable -- 关联子查询获取每个用户的最近一次配送日期 join ( SELECT Customer_id, max(Delivery_Date) as recent_CDelivery_Date from `piattosteakhouse.ALFACO.Ordering_Co_Orders` group by 1 ) as recentCDelivery_Date on maintable.Customer_id = recentCDelivery_Date.Customer_id group by 1,2,3 ), -- 此处添加逗号分隔多个CTE rfm as ( select Customer_id, DATE_DIFF(CURRENT_DATE(),recent_CDelivery_Date,day) as recency, count(Customer_id) as frequency, sum(Subtotal) as monetary from combinedtable group by 1 -- 仅按用户ID分组即可 order by recency ) -- 输出最终RFM结果 select * from rfm
内容的提问来源于stack exchange,提问作者Moham
相关产品推荐
相关产品推荐

