如何以固定基准行值为除数计算COHORT列的SHARE占比
客户群组留存占比计算实现方案
核心逻辑是先定位到最小年月对应的初始客户总量作为计算基准分母,再逐行用当月留存客户数除以基准值得到百分比,根据使用的SQL环境不同,有两种通用实现方式:
- 窗口函数实现(推荐,适配MySQL 8.0+、Hive、Spark SQL、PostgreSQL等所有支持ANSI窗口函数的引擎)
不需要额外关联表,直接通过窗口函数取排序后的首行COHORT值作为基准,写法简洁性能好:
SELECT YEAR, MONTH, COHORT, CONCAT(ROUND(COHORT / FIRST_VALUE(COHORT) OVER (ORDER BY YEAR, MONTH) * 100, 0), '%') AS SHARE FROM 你的业务表名;
逻辑说明:FIRST_VALUE(COHORT) OVER (ORDER BY YEAR, MONTH) 会按年月升序排序后,取第一行(也就是最早月份2015年1月)的COHORT值作为全局分母,乘以100后取整拼接百分号,直接得到要求的SHARE字段结果。
- 子查询关联实现(适配不支持窗口函数的老版本环境,比如MySQL 5.x)
先单独查出最早月份的初始客户量,再和原表做笛卡尔关联逐行计算:
SELECT t.YEAR, t.MONTH, t.COHORT, CONCAT(ROUND(t.COHORT / base.init_cohort * 100, 0), '%') AS SHARE FROM 你的业务表名 t CROSS JOIN ( SELECT COHORT AS init_cohort FROM 你的业务表名 ORDER BY YEAR, MONTH LIMIT 1 ) base;
注意:你给出的目标表示例里2015年1月的COHORT值写为212,和原始表的100不一致,按照你描述的「最小年月对应行的COHORT为总数值」规则,计算时会自动以原始表最早月份的COHORT值为基准,如果实际业务中初始值为212,替换对应原始数据即可。
内容的提问来源于stack exchange,提问作者Marcos Dias
相关产品推荐
相关产品推荐

