案例
case
检查一个值是否与一组条件匹配,并根据第一个满足的条件返回某些输出。基本上,case
的功能与 “if…then” 逻辑 相同,但编写起来更简洁。
你可以选择性地告诉 case
在没有任何条件满足时返回默认输出。如果你没有设置默认输出,case
在检查所有条件后将返回 null
(在 Metabase 中,null
值显示为空白值)。
当你需要时使用 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+ |
其中 分类 是一个包含表达式的自定义列
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 | True | True | 鸟 |
2 | True | False | 飞机 |
3 | False | False | 超人 |
4 | False | True | 未知 |
其中 目击类型 是一个包含表达式的自定义列
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]))
并将其命名为“总已发货订单”。 - 选择 订单日期 作为分组列。
- 点击 可视化 返回结果
订单日期 | 总已发货订单 |
---|---|
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: 合并值 示例中的表格
注释 | 注释 | 将([Notes],[Comments] "没有笔记或评论。")合并 |
---|---|---|
我有笔记。 | 我有评论。 | 我有笔记。 |
我有评论。 | 我有评论。 | |
我有笔记。 | 我有笔记。 | |
没有笔记或评论。 |
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 | 已取消 |
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 |
sumif([Amount], [Status] = "Shipped")
与case
表达式等价
sum(case([Status] = "Shipped", [Amount]))
sumif
在仅有一个条件时对单个列求和时与case
等价。
如果你想在第二个、独立的条件下对第二个列求和,应该使用case
。例如,如果你想在状态 = “已发货”时求和金额列,以及在状态 = “已退款”时求和(假设的)退款金额列。
SQL
在大多数情况下(除非你使用NoSQL数据库),使用笔记本编辑器创建的问题将被转换为针对你的数据库或数据仓库运行的SQL查询。Metabase的case
表达式将被转换为SQL的CASE WHEN
语句。
使用基于多列条件标记行示例中的表格
目击 ID | 有翅膀 | 有面部 | 目击类型 |
---|---|---|---|
1 | True | True | 鸟 |
2 | True | False | 飞机 |
3 | False | False | 超人 |
4 | False | True | 未知 |
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
与用于观测类型的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 | True | True | 鸟 |
2 | True | False | 飞机 |
3 | False | False | 超人 |
4 | False | True | 未知 |
电子表格公式
=IF(AND(B2 = TRUE, C2 = TRUE), "Bird",
IF(AND(B2 = TRUE, C2 = FALSE), "Plane",
IF(AND(B2 = FALSE, C2 = TRUE), "Superman", "Unknown")
)
)
与用于观测类型的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 | True | True | 鸟 |
2 | True | False | 飞机 |
3 | False | False | 超人 |
4 | False | True | 未知 |
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)
上述方法与用于观测类型的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版本的文档。