完全指南:从查询构建器到 SQL 实现)
Metabase 累计计数与累计求和Cumulative Count / Cumulative Sum完全指南从查询构建器到 SQL 实现【免费下载链接】metabaseThe easy-to-use open source Business Intelligence and Embedded Analytics tool that lets everyone work with data :bar_chart:项目地址: https://gitcode.com/GitHub_Trending/me/metabase本文以 Metabase 查询构建器中的累计指标CumulativeCount 与 CumulativeSum为核心系统讲解其语法、底层计算逻辑、多分组Breakout下的累计维度选择规则以及等价 SQL 窗口函数写法。读完本文你将掌握累计指标在 Metabase 中的行为边界与排序敏感性能够在实际报表中正确设计运行总计类分析。累计指标是 Metabase 查询构建器中汇总Summarize步骤预置的两类指标CumulativeCount计算跨分组维度的累计行数running total of rowsCumulativeSum计算某列跨分组的滚动求和。它们特别适合表达截至某时间点的总量这类业务问题例如月度订单的累计订单数、按产品分类的累计销售额。语法与使用位置在查询构建器中累计指标有两种使用方式直接选用 Summarize 步骤预置的Cumulative count与Cumulative sum指标或者在自定义表达式中使用如下语法CumulativeCountCumulativeSum(column)其中CumulativeCount不需要参数对行数做累计CumulativeSum需要指定要累加的数值列。使用边界重要累计指标只能用于查询构建器的Summarize汇总步骤不能用来创建自定义列Custom column或自定义筛选条件Filter。这一限制在源码层有明确体现src/metabase/lib/expression.cljc的invalid-nesting校验将:cum-countCumulativeCount与:cum-sumCumulativeSum列入不支持嵌入到其他表达式的特殊聚合名单同时在表达式模式:expression下若检测到 OFFSET 类子句会直接报错从机制上保证了累计指标只出现在合法的聚合上下文中。前端侧frontend/src/metabase-lib/query/clauses/clauses.ts为这些表达式配置了docsPage: cumulative的文档入口方便用户在编辑器中一键跳转到本文对应的官方文档。累计指标的计算方式Metabase 计算累计计数时底层分三步进行使用Group by分组块中的维度对记录分组统计每个分组内的行数对每个分组将其自身及之前所有分组的计数累加得到累计值。由于累计指标依赖之前的行分组维度上的排序顺序直接影响计算结果。以按月份分组的数据为例Metabase 会这样计算累计计数MonthCount()CumulativeCount()July55November45 4 9March25 4 2 11如果保持数值不变、仅改变排序累计结果也随之变化MonthCount()CumulativeCount()March22July52 5 7November42 5 4 11可见累计指标是对当前分组及其之前所有分组的滚动累加最终总和11不变但中间每一步的累计值完全取决于排序。默认排序规则当查询只有一个分组维度时Metabase 会按该分组列升序排列数据使用数据库对该列数据类型定义的排序逻辑例如日期按时间先后、字符串按数据库默认 collation。要改变累计的方向例如按降序累计或按业务自定义顺序累计可以在查询中添加针对分组列的Sort排序块。多个分组维度时的累计规则当查询中存在多个分组维度时Metabase 需要确定之前的行到底沿哪个维度累计。其决策顺序是先看是否有日期时间维度再看其他分组维度的排列顺序。包含日期时间维度的查询如果Group by块中包含日期时间维度Metabase 会沿日期时间维度累计然后按顺序沿Group by块中其他字段分组展示如果存在多个日期时间维度包括对同一日期列的不同粒度分组如同时按 Created At: Month 和 Viewed At: Week 分组Metabase 会沿更细粒度更小的时间单位的维度累计而与其在 Group by 块中的排列顺序无关。例如同时按 Created At: Month 与 Viewed At: Week 分组时累计将沿 Viewed At: Week 进行在包含日期时间维度的查询中针对非日期字段的 Sort 块不会影响计算方式只会影响结果中分组的展示顺序。不包含日期时间维度的查询如果Group by块中没有日期时间字段Metabase 会沿 Group by 块中最后一个维度累计并按从左到右的顺序沿其他字段分组展示默认情况下用于累计的那个维度按升序排列。你可以为累计维度添加Sort块来改变顺序——这将同时改变累计指标的计算方式与结果的呈现顺序而对除最后一个累计字段之外的任何字段排序只会影响结果的展示顺序不会改变计算方式。这一沿最后维度累计的行为与src/metabase/lib/aggregation.cljc中注释所描述的语义一致count与cumulative count均可无参统计行数或带一个参数统计某字段的非空值个数使用累计值的本质是对逐分组统计结果的滚动累加。等价 SQL用窗口函数实现累计指标累计指标在 SQL 中对应窗口函数Window Function。你可以点击查询构建器右上角的View SQL_按钮随时查看 Metabase 为当前可视化查询生成的 SQL。SQL 中的累计计数例如要按月统计订单的累计数量可以使用如下查询对count(*)结果再做一次SUM ... OVER滚动求和SELECT created_month, SUM(count(*)) OVER ( ORDER BY created_month ASC ROWS UNBOUNDED PRECEDING ) AS sum FROM ( SELECT quantity, DATE_TRUNC (month, created_at) AS created_month FROM orders ) GROUP BY created_month ORDER BY created_month ASCSQL 中的累计求和对于累计求和则是对分组后的SUM(quantity)再做滚动累加SELECT created_month, SUM(SUM(quantity)) OVER ( ORDER BY created_month ASC ROWS UNBOUNDED PRECEDING ) AS sum FROM ( SELECT quantity, DATE_TRUNC (month, created_at) AS created_month FROM orders ) GROUP BY created_month ORDER BY created_month ASC两段 SQL 的核心模式相同先用子查询DATE_TRUNC将时间截断到月并完成分组聚合再用SUM(...) OVER (ORDER BY created_month ASC ROWS UNBOUNDED PRECEDING)对聚合结果按时间升序做无界前行窗口累加。ROWS UNBOUNDED PRECEDING表示窗口从首行延伸到当前行这正是截至当前分组的语义来源。小结与最佳实践累计指标CumulativeCount/CumulativeSum仅限查询构建器的 Summarize 步骤使用不能用于自定义列或自定义筛选。计算结果依赖排序单分组时默认按分组列升序累计可通过Sort块调整累计方向。多分组时优先沿日期时间维度累计多日期时取更细粒度无日期时间维度时沿 Group by 块中最后一个字段累计。非累计维度的排序只影响展示顺序不影响数值计算。需要精确控制时可点击View SQL查看生成的窗口函数 SQL或在原生查询SQL中直接编写SUM(...) OVER (ORDER BY ... ROWS UNBOUNDED PRECEDING)实现等价逻辑。掌握上述规则后你可以在 Metabase 中稳定地构建运行总计类图表避免因分组顺序或排序设置不当而产生误导性的累计数值。【免费下载链接】metabaseThe easy-to-use open source Business Intelligence and Embedded Analytics tool that lets everyone work with data :bar_chart:项目地址: https://gitcode.com/GitHub_Trending/me/metabase创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考