在Superset中按账户级计算NDR并支持产品筛选的技术问询
在Superset中实现支持产品筛选的账户级NDR计算
核心思路
要实现账户级NDR并支持产品筛选,关键是先按账户聚合:先判断该账户是否满足“过去3-4个月有采购”的条件,再统计其最近2个月的采购总额,同时让产品筛选自动作用于所有采购记录(历史判断和最近统计环节)。Jinja模板可以帮我们动态引入Superset的筛选条件,避免硬编码。
具体实现步骤
假设你的采购表名为purchase_data,包含字段:account_id(账户ID)、product_name(产品名称)、purchase_date(采购日期)、amount(采购金额)。
1. 创建自定义SQL数据集
在Superset中新建一个SQL Lab数据集,使用以下Jinja模板编写查询:
SELECT account_id, -- 判断账户是否在过去3-4个月有符合筛选条件的采购 CASE WHEN EXISTS ( SELECT 1 FROM purchase_data pd_hist WHERE pd_hist.account_id = pd_curr.account_id {{ filter_clause('pd_hist') }} -- 应用产品筛选到历史采购记录 AND pd_hist.purchase_date >= DATE_TRUNC('month', CURRENT_DATE) - INTERVAL '4 months' AND pd_hist.purchase_date < DATE_TRUNC('month', CURRENT_DATE) - INTERVAL '2 months' ) THEN -- 统计该账户最近2个月的采购总额(受产品筛选影响) SUM(CASE WHEN pd_curr.purchase_date >= DATE_TRUNC('month', CURRENT_DATE) - INTERVAL '2 months' THEN pd_curr.amount ELSE 0 END) ELSE 0 END AS ndr_amount FROM purchase_data pd_curr {{ filter_clause('pd_curr') }} -- 应用产品筛选到最近采购记录 GROUP BY account_id
注意:日期函数需适配你的数据库类型(比如MySQL用
DATE_SUB(CURDATE(), INTERVAL 4 MONTH)替代PostgreSQL的INTERVAL语法)。
2. 配置柱状图
- 选择上述SQL数据集作为数据源
- X轴选择
account_id(账户维度) - Y轴选择
ndr_amount(计算出的NDR金额) - 添加
product_name作为筛选器,此时筛选条件会自动作用于历史采购判断和最近金额统计,实现产品维度的筛选控制。
原指标无法满足需求的原因
你之前创建的sum(case when trailing3-4months is not null then trailing1-2months)是**行级(账户+产品)**计算,聚合后仍保留产品维度,无法实现跨产品的账户级统计。而上述方案先按账户分组,通过EXISTS判断账户整体是否符合条件,再统计该账户的总金额,彻底实现账户级聚合。
关键注意点
- 确保Superset开启Jinja模板支持:在配置文件中设置
ENABLE_JINJA_TEMPLATING = True - 若需按月份统计账户NDR(比如每月的账户留存金额),可添加
DATE_TRUNC('month', pd_curr.purchase_date)到GROUP BY和查询字段中,实现时间维度的拆分
内容的提问来源于stack exchange,提问作者David Shrem
相关产品推荐
相关产品推荐

