累积计数和累积求和
累积计数计算跨分组行的累加总计数。累积求和计算跨分组列的滚动求和(也称为运行总计)。
语法
您可以使用预定义的“累积计数”和“累积求和”指标,或自定义表达式
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 的文档。