Apache Superset饼图动态分类:Top10产品与Others分组及过滤问题
解决Apache Superset的两个饼图需求
一、实现动态Top10产品+Others的SQL(MariaDB)
你的原SQL存在三个问题:一是硬编码了销量阈值(还写错成30而非需求里的300),二是没筛选销量≥300的Top10产品,三是分组后丢失原始产品信息,导致无法过滤Others里的具体产品。以下是修正后的SQL,既满足不硬编码阈值的要求,又能保留原始产品字段供后续过滤使用:
WITH product_sales AS ( -- 计算每个产品总销量,并标记是否达标(销量≥300) SELECT product, SUM(sales_volume) AS total_sales, -- 请根据实际表结构替换销量字段名 CASE WHEN SUM(sales_volume) >= 300 THEN 1 ELSE 0 END AS meets_threshold FROM Sales GROUP BY product ), ranked_products AS ( -- 对达标产品按销量降序排名,取Top10 SELECT product, total_sales, ROW_NUMBER() OVER (ORDER BY total_sales DESC) AS sales_rank FROM product_sales WHERE meets_threshold = 1 ) -- 最终分组:Top10保留原名,其余归为Others,同时保留原始产品字段 SELECT CASE WHEN rp.sales_rank <= 10 THEN rp.product ELSE 'Others' END AS grouped_product, ps.product AS original_product, -- 保留原始产品字段用于过滤 ps.total_sales FROM product_sales ps LEFT JOIN ranked_products rp ON ps.product = rp.product
关键说明
- 用CTE拆分逻辑,避免重复计算,提升可读性
- 通过窗口函数
ROW_NUMBER()动态获取达标Top10产品,无需硬编码阈值(若要让阈值可动态调整,可结合Superset参数化查询) - 保留
original_product字段,为后续过滤Others中的具体产品提供数据支持
二、Superset中配置过滤功能
- 数据集导入:将上述SQL作为自定义SQL数据集导入Superset,确保
grouped_product和original_product字段被正确识别 - 饼图可视化设置:
- 维度选择
grouped_product,度量选择total_sales(聚合方式设为SUM)
- 维度选择
- 过滤配置:
- 添加一个过滤器,字段选择
original_product,类型设为“多选”或“下拉” - 当用户选择原属Others的产品时,Superset会自动筛选出对应产品的销量数据,因为
original_product保留了完整的原始产品信息 - 若要默认展示Top10+Others的汇总视图,可在数据集或可视化中添加默认过滤规则
- 添加一个过滤器,字段选择
额外优化建议
- 若要让销量阈值(300)支持用户动态调整,可使用Superset的参数化查询,将SQL中的
300替换为:sales_threshold,然后在数据集配置中设置该参数为数字类型,用户即可在可视化界面直接修改阈值 - 若Others占比过高,可在Superset可视化设置中调整“合并小分组”的规则,进一步优化饼图展示效果
内容的提问来源于stack exchange,提问作者Sara H
相关产品推荐
相关产品推荐

