案例
case(别名 if)检查一个值是否与一系列条件匹配,并根据第一个满足的条件返回某种输出。if 和 case 的工作方式完全相同。
您可以选择性地告诉 case 在没有任何条件满足时返回一个默认输出。如果您不设置默认输出,case 将在检查完所有条件后返回 null(null 值在 Metabase 中显示为空白值)。
每当您需要时,请使用 case 表达式来
| 语法 |
|---|
case(condition1, output1, condition2, output2, ..., default_output) |
| 返回第一个满足的条件的输出。 |
| 示例 |
|---|
case(isempty("glass half full"), "empty glass", isNull("glass half full"), "missing glass", "glass half full") |
| “glass half full” |
为频数表或直方图分桶数据
| 金额 | 桶 |
|---|---|
| 6 | 0-9 |
| 18 | 10-19 |
| 31 | 30-39 |
| 57 | 50+ |
其中 Bucket 是一个自定义列,使用表达式
case([Amount] >= 0 AND [Amount] <= 9, "0-9",
[Amount] >= 10 AND [Amount] <= 19, "10-19",
[Amount] >= 20 AND [Amount] <= 29, "20-29",
[Amount] >= 30 AND [Amount] <= 39, "30-39",
[Amount] >= 40 AND [Amount] <= 49, "40-49", "50+")
基于多列条件标记行
| 目击 ID | 有翅膀 | 有脸 | 目击类型 |
|---|---|---|---|
| 1 | 真 | 真 | 鸟 |
| 2 | 真 | 假 | 飞机 |
| 3 | 假 | 真 | 超人 |
| 4 | 假 | 假 | 未知 |
其中 Sighting Type 是一个自定义列,使用表达式
case([Has Wings] = TRUE AND [Has Face] = TRUE, "Bird",
[Has Wings] = TRUE AND [Has Face] = FALSE, "Plane",
[Has Wings] = FALSE AND [Has Face] = TRUE, "Superman", "Unknown")
您可以使用包含“标签”的列来
- 应用业务定义或业务逻辑到您的数据集中。
- 驱动筛选器.
- 对行和列安全进行数据分段.
基于多列条件聚合数据
您可以将 case 与 聚合函数结合使用,只聚合满足您条件的行。
例如,如果我们想计算每个订单日期的唯一订单数量,但只计算状态为“已发货”的订单
| 订单 ID | 订单日期 | 状态 |
|---|---|---|
| 1 | 2022-04-01 | 已付款 |
| 1 | 2022-04-03 | 已发货 |
| 2 | 2022-05-12 | 已付款 |
| 2 | 2022-05-12 | 已取消 |
- 创建自定义表达式
distinct(case([Status] = "Shipped", [Order ID]))并将其命名为“总已发货订单”。 - 选择 Order Date 作为分组依据列。
- 点击 可视化 以返回结果
| 订单日期 | 总已发货订单 |
|---|---|
| 2022-04-01 | 1 |
| 2022-05-01 | 0 |
支持的数据类型
| 数据类型 | 与 case 配合使用 |
|---|---|
| 字符串是 | ✅ |
| 数字 | ✅ |
| 时间戳 | ✅ |
| 布尔值 | ✅ |
| JSON | ❌ |
限制
所有输出必须具有相同的数据类型。
避免:
case(condition1, "string", condition2, TRUE, condition3, 1)
执行:
case(condition1, "string", condition2, "TRUE", condition3, "1")
相关函数
本节介绍了可与 Metabase case 表达式互换使用的函数和公式,并附有关于如何为您的用例选择最佳选项的说明。
其他工具
Coalesce
使用来自 Coalesce: 合并值示例中的表
| 说明 | 评论 | coalesce([Notes], [Comments] "无备注或评论。") |
|---|---|---|
| 我有一条备注。 | 我有一条评论。 | 我有一条备注。 |
| 我有一条评论。 | 我有一条评论。 | |
| 我有一条备注。 | 我有一条备注。 | |
| 无备注或评论。 |
Metabase coalesce 表达式
coalesce([Notes], [Comments] "No notes or comments.")
等同于 case 表达式
case(ISBLANK([Notes]) = FALSE AND ISBLANK([Comments]) = FALSE, [Notes],
ISBLANK([Notes]) = TRUE AND ISBLANK([Comments]) = False, [Comments],
ISBLANK([Notes]) = FALSE AND ISBLANK([Comments]) = TRUE, [Notes],
ISBLANK([Notes]) = TRUE AND ISBLANK([Comments]) = TRUE, "No notes or comments")
如果您不介意在两个列都非空时取第一个值,那么 coalesce 的写法会更简洁。如果您想为这种情况定义一个特定的输出(例如,“我有一条备注和一条评论”),请使用 case。
Countif
使用来自 聚合数据示例中的表
| 订单 ID | 订单日期 | 状态 |
|---|---|---|
| 1 | 2022-04-01 | 已付款 |
| 1 | 2022-04-03 | 已发货 |
| 2 | 2022-05-12 | 已付款 |
| 2 | 2022-05-12 | 已取消 |
Metabase countif 表达式
countif(case([Status] = "Shipped"))
等同于 case 表达式
count(case([Status] = "Shipped", [Row ID]))
countif 等同于 case,当您计算满足条件的**所有**行时。如果您想计算满足条件的**唯一**行,则它**不**等同。
Sumif
使用来自 聚合数据示例的扩展表
| 行 ID | 订单 ID | 订单日期 | 状态 | 金额 |
|---|---|---|---|---|
| 1 | 1 | 2022-04-01 | 已付款 | $20 |
| 2 | 1 | 2022-04-03 | 已发货 | $20 |
| 3 | 2 | 2022-05-12 | 已付款 | $80 |
| 4 | 2 | 2022-05-12 | 已取消 | $80 |
Metabase sumif 表达式
sumif([Amount], [Status] = "Shipped")
等同于 case 表达式
sum(case([Status] = "Shipped", [Amount]))
sumif 等同于 case,当您对单一条件的单一列求和时。
如果您想在第二个、单独的条件下对第二个列求和,您应该使用 case。例如,如果您想在 Status = “Shipped” 时对 Amount 列求和,并在 Status = “Refunded” 时对另一个(假设的)列 Refunded Amount 求和。
SQL
在大多数情况下(除非您使用的是 NoSQL 数据库),通过笔记本编辑器创建的问题会被转换为 SQL 查询,这些查询会针对您的数据库或数据仓库运行。Metabase case 表达式会被转换为 SQL CASE WHEN 语句。
使用来自 标记行示例中的表
| 目击 ID | 有翅膀 | 有脸 | 目击类型 |
|---|---|---|---|
| 1 | 真 | 真 | 鸟 |
| 2 | 真 | 假 | 飞机 |
| 3 | 假 | 假 | 超人 |
| 4 | 假 | 真 | 未知 |
SQL CASE WHEN 语句
SELECT
CASE WHEN "Has Wings" = TRUE AND "Has Face" = TRUE THEN "Bird"
WHEN "Has Wings" = TRUE AND "Has Face" = FALSE THEN "Plane"
WHEN "Has Wings" = FALSE AND "Has Face" = TRUE THEN "Superman"
ELSE "Unknown" END
FROM mystery_sightings
等同于用于**Sighting Type**的 case 表达式
case([Has Wings] = TRUE AND [Has Face] = TRUE, "Bird",
[Has Wings] = TRUE AND [Has Face] = FALSE, "Plane",
[Has Wings] = FALSE AND [Has Face] = TRUE, "Superman", "Unknown")
例如,这个用于排序条形图的 SQL 技巧可以使用 Metabase case 表达式来代替。
电子表格
使用来自 标记行示例中的表
| 目击 ID | 有翅膀 | 有脸 | 目击类型 |
|---|---|---|---|
| 1 | 真 | 真 | 鸟 |
| 2 | 真 | 假 | 飞机 |
| 3 | 假 | 假 | 超人 |
| 4 | 假 | 真 | 未知 |
电子表格公式
=IF(AND(B2 = TRUE, C2 = TRUE), "Bird",
IF(AND(B2 = TRUE, C2 = FALSE), "Plane",
IF(AND(B2 = FALSE, C2 = TRUE), "Superman", "Unknown")
)
)
等同于用于**Sighting Type**的 case 表达式
case([Has Wings] = TRUE AND [Has Face] = TRUE, "Bird",
[Has Wings] = TRUE AND [Has Face] = FALSE, "Plane",
[Has Wings] = FALSE AND [Has Face] = TRUE, "Superman", "Unknown")
Python
有很多方法可以使用 Python 实现条件逻辑。我们将涵盖适用于转换为 Metabase case 表达式的方法。
使用来自 标记行示例(并假设它在名为 df 的数据框中)的表
| 目击 ID | 有翅膀 | 有脸 | 目击类型 |
|---|---|---|---|
| 1 | 真 | 真 | 鸟 |
| 2 | 真 | 假 | 飞机 |
| 3 | 假 | 假 | 超人 |
| 4 | 假 | 真 | 未知 |
numpy select()
conditions = [
(df["has_wings"] == True) & (df["has_face"] == True),
(df["has_wings"] == True) & (df["has_face"] == False),
(df["has_wings"] == False) & (df["has_face"] == True)]
outputs = ["Bird", "Plane", "Superman"]
df["Sighting Type"] = np.select(conditions, outputs, default="Unknown")
带有 pandas apply() 的辅助函数
def Identify(df):
if ((df["has_wings"] == True) & (df["has_face"] == True)):
return "Bird"
elif ((df["has_wings"] == True) & (df["has_face"] == False)):
return "Plane"
elif ((df["has_wings"] == False) & (df["has_face"] == True)):
return "Superman"
else:
return "Unknown"
df["Sighting Type"]= df.apply(Identify, axis=1)
上述方法等同于用于**Sighting Type**的 case 表达式
case([Has Wings] = TRUE AND [Has Face] = TRUE, "Bird",
[Has Wings] = TRUE AND [Has Face] = FALSE, "Plane",
[Has Wings] = FALSE AND [Has Face] = TRUE, "Superman", "Unknown")
延伸阅读
阅读其他版本的 Metabase 的文档。