累计计数和求和
累计计数计算在分组中行的累加总数。累计求和计算在分组中列的滚动求和(也称为运行总计)。
语法
您可以使用预定义的“累计计数”和“累计求和”度量,或自定义表达式。
CumulativeCount
CumulativeSum(column)
累计度量只能在查询构建器的 汇总 步骤中使用 — 您不能使用累计度量来创建自定义列或筛选器。
累计度量的计算方式
在底层,累计度量通过三个步骤计算:
- 使用 分组依据 块中的分组对记录进行分组。
- 计算每个组中的行数。
- 对于每个组,计算所有先前组(包括当前组)中计数的累计总数。
由于累计度量使用先前行的值,因此分组列中的排序顺序很重要。
例如,如果您的表格数据按月份分组,Metabase 将按如下方式计算累计计数:
月份 | 计数() |
累计计数() |
---|---|---|
七月 | 5 | 5 |
十一月 | 4 | 5+4 = 9 |
三月 | 2 | 5 + 4 + 2 = 11 |
如果排序发生变化(而值保持不变),则累计计数也会随之变化。
月份 | 计数() |
累计计数() |
---|---|---|
三月 | 2 | 2 |
七月 | 5 | 2 + 5 = 7 |
十一月 | 4 | 2 + 5 + 4 = 11 |
当查询中只有一个分组时,Metabase 将根据分组列的升序对数据进行排序(使用您的数据库为该列数据类型定义的逻辑)。要更改 Metabase 累计度量的方式,您可以通过分组列添加一个 排序 块。
具有多个分组的累计度量
由于累计度量是根据先前行计算其汇总值的,Metabase 需要确定这些先前行是什么。Metabase 将首先根据您是否按日期时间列分组,然后根据其他分组的顺序来决定如何计算和显示累计度量。
带有日期时间维度的查询
如果您在 分组依据 块中使用日期时间维度,Metabase 将沿日期时间维度进行累计,然后按 分组依据 块中的其他字段(按顺序)进行分组。
如果存在多个日期时间维度(包括按相同日期时间列进行的多次分组),Metabase 将沿更精细的维度进行累计,无论它们的顺序如何。例如,如果您按“创建时间:月”和“查看时间:周”分组,Metabase 将沿“查看时间:周”进行累计。
在带有日期时间维度的查询中,非日期时间字段的 排序 块不会影响 Metabase 计算结果的方式。排序块只会影响结果中分组的顺序。
没有日期时间维度的查询
如果 分组依据 块中没有日期时间字段,Metabase 将沿 分组依据 块中指定的 最后一个 维度进行累计,并按其他字段从左到右的顺序进行分组。
默认情况下,Metabase 将对用于累计的维度使用升序排序。您可以为累计维度添加一个 排序 块来更改顺序,这将同时改变 Metabase 计算累计度量的方式和呈现结果的方式。
对 除 最后一个(累计)字段之外的任何字段进行排序,只会影响结果中分组的顺序。它不会改变 Metabase 计算结果的方式。
相关函数
SQL 中的累计计数
在 SQL 中,您可以使用窗口函数来计算累计度量。例如,要计算按月累计的订单计数,您可以使用以下查询:
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 ASC
SQL 中的累计求和
对于累计求和,您可以使用:
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 (>_) 按钮来查看查询构建器生成的 SQL。
阅读其他 Metabase 版本的文档。