表达式列表
有关表达式的介绍,请查看自定义表达式概览。
-
函数
聚合
聚合表达式会考虑字段中的所有值。它们只能在查询构建器的“汇总”部分中使用。
平均值
返回列中值的平均值。
语法:Average(列)
示例:Average([数量])
将返回“数量
”字段的平均值。
计数
返回所选数据中行(也称为记录)的计数。
语法:Count
示例:Count
如果表或结果返回 10 行,则 Count
将返回 10
。
条件计数
仅计算条件为真的行。
语法:CountIf(条件)
。
示例:CountIf([小计] > 100)
将返回小计大于 100 的行数。
去重计数
此列中不同值的数量。
语法:Distinct(列)
。
Distinct([姓氏])
。返回列中唯一姓氏的计数。重复项(例如,姓氏“Smith”)不计数。
最大值
返回列中找到的最大值。
语法:Max(列)
。
示例:Max([年龄])
将返回“年龄
”列中所有值中最大的年龄。
中位数
返回指定列的中位数。
语法:Median(列)
。
示例:Median([年龄])
将找到年龄的中点值,其中一半年龄较大,一半年龄较小。
不支持 median
的数据库:Druid、MariaDB、MongoDB、MySQL、SQLite、Vertica 和 SQL Server。 Presto 仅提供近似结果。
最小值
返回列中找到的最小值。
语法:Min(列)
。
示例:Min([薪资])
将找到“薪资
”列中所有薪资中的最低薪资。
百分位数
返回百分位数值处列的值。
语法:Percentile(列, 百分位数值)
示例:Percentile([分数], 0.9)
将返回该列中所有值的第 90 个百分位数值。
不支持 percentile
的数据库:Druid、H2、MariaDB、MySQL、MongoDB、SQL Server、SQLite、Vertica。 Presto 仅提供近似结果。
占比
以十进制形式返回数据中与条件匹配的行百分比。
语法:Share(条件)
示例:Share([颜色] = "蓝色")
将返回“颜色
”字段设置为“蓝色
”的行数,除以总行数。
标准差
计算列的标准差,它是衡量一组数值离散程度的指标。标准差低表示数值集中在均值附近,而标准差高表示数值分布在较宽的范围内。
语法: StandardDeviation(column)
示例: StandardDeviation([Population])
将返回 Population
列中值的标准差。
不支持 StandardDeviation
的数据库:Druid, SQLite。
总和
将列的所有值相加。
语法: Sum(column)
示例: Sum([Subtotal])
将 Subtotal
列中的所有值相加。
条件求和
仅对条件为真的行,将指定列的值相加。
语法: SumIf(column, condition)
。
示例:SumIf([Subtotal], [Order Status] = "Valid")
将订单状态为“Valid”的所有小计相加。
方差
返回给定列的数值方差。
语法: Variance(column)
示例: Variance([Temperature])
将返回该列中所有温度值相对于平均温度的离散程度。
相关函数: StandardDeviation, Average。
不支持 Variance
的数据库:Druid, SQLite。
函数
函数表达式应用于每个单独的值。它们可用于更改或过滤列中的值,或创建新的自定义列。
逻辑函数
逻辑函数确定条件是否满足,或根据条件确定要返回的值。
介于
如果日期或数字列的值落在指定的范围内,则返回 true。否则返回 false。
语法: between(column, start, end)
示例: 如果您使用表达式 between([Created At], "2019-01-01", "2020-12-31")
进行过滤,Metabase 将返回该表达式返回 true 的行,在本例中,Created At
日期落在 2019 年 1 月 1 日和 2020 年 12 月 31 日的范围之内,包括开始日期 (2019-01-01
) 和结束日期 (2020-12-31
)。
相关函数: interval。
条件
case
(别名 if
) 根据一系列情况测试表达式,并返回第一个匹配情况的对应值,如果所有情况都不匹配,则返回可选的默认值。
语法: case(condition, output, …)
示例: case([Weight] > 200, "Large", [Weight] > 150, "Medium", "Small")
如果 Weight
为 250,则表达式将返回“Large”。在本例中,默认值为“Small”,因此任何 Weight
小于等于 150 的值都将返回“Small”。
合并
按顺序查看每个参数中的值,并为每行返回第一个非空值。
语法: coalesce(value1, value2, …)
示例: coalesce([Comments], [Notes], "No comments")
。如果 Comments
和 Notes
列在该行中都为空,则表达式将返回字符串“No comments”。
如果
if
是 case 的别名。根据一系列条件测试表达式,并返回第一个匹配情况的对应值,如果所有情况都不匹配,则返回可选的默认值。
语法: if(condition, output, ...)
示例: if([Weight] > 200, "Large", [Weight] > 150, "Medium", "Small")
如果 Weight
为 250,则表达式将返回“Large”。在本例中,默认值为“Small”,因此任何 Weight
小于等于 150 的值都将返回“Small”。
为空
如果列为空,则返回 true。
语法: isnull(column)
示例: isnull([Tax])
如果该行的列中没有值,则返回 true。
非空
如果列包含值,则返回 true。
语法: notnull(column)
示例: notnull([Tax])
如果该行的列中存在值,则返回 true。
数学函数
数学函数实现常见的数学运算。
绝对值
返回指定列的绝对(正)值。
语法: abs(column)
示例: abs([Debt])
。如果 Debt
为 -100,abs(-100)
将返回 100
。
向上取整
将小数向上舍入(ceil,如天花板)。
语法: ceil(column)
。
示例: ceil([Price])
。ceil(2.99)
将返回 3。
指数
返回 欧拉数 e 的指定次幂。(欧拉听起来像“Oy-ler”)。
语法: exp(column)
。
示例: exp([Interest Months])
相关函数: power。
向下取整
将小数向下舍入。
语法: floor(column)
示例: floor([Price])
。如果 Price
为 1.99,则表达式将返回 1。
对数
返回以 10 为底的对数。
语法: log(column)
。
示例: log([Value])
。
幂
将数字提升到指数值的幂。
语法: power(column, exponent)
。
示例: power([Length], 2)
。如果长度为 3
,则表达式将返回 9
(3 的二次方是 3*3)。
不支持 power
的数据库:SQLite。
相关函数: exp。
四舍五入
将小数四舍五入到最接近的整数值。
语法: round(column)
。
示例: round([Temperature])
。如果温度为 13.5
摄氏度,则表达式将返回 14
。
示例: round([Temperature] * 10) / 10
。如果温度为 100.75
,则表达式将返回 100.8
。
平方根
返回值的平方根。
语法: sqrt(column)
。
示例: sqrt([Hypotenuse])
。
不支持 sqrt
的数据库:SQLite。
相关函数: Power。
字符串函数
字符串函数操作或验证字符串数据。
连接
将两个或多个字符串组合在一起。
语法: concat(value1, value2, …)
示例: concat([Last Name], ", ", [First Name])
将生成格式为“Last Name, First Name”的字符串,例如“Palazzo, Enrico”。
包含
检查 string1
是否包含 string2
。
默认执行区分大小写的匹配。您可以传递可选参数 "case-insensitive"
来执行不区分大小写的匹配。
语法: contains(string1, string2)
用于区分大小写的匹配。
contains(string1, string2, "case-insensitive")
用于不区分大小写的匹配。
示例: contains([Status], "Class")
。
如果 Status
为“Classified”,则表达式将返回 true
。如果 Status
为 “classified”,则表达式将返回 false
,因为大小写不匹配。
相关函数: doesNotContain, regexextract。
不包含
检查 string1
是否包含 string2
。
默认执行区分大小写的匹配。您可以传递可选参数 "case-insensitive"
来执行不区分大小写的匹配。
语法: doesNotContain(string1, string2)
用于区分大小写的匹配。
doesNotContain(string1, string2, "case-insensitive")
用于不区分大小写的匹配。
示例: doesNotContain([Status], "Class")
。如果 Status
为“Classified”,则表达式将返回 false
。
相关函数: contains, regexextract。
域名
从 URL 或电子邮件中提取域名。
语法: domain(urlOrEmail)
。
示例: domain([Page URL])
。如果 [Page URL]
列的值为 https://metabase.net.cn
,则 domain([Page URL])
将返回 metabase
。domain([Email])
将从 [email protected]
中提取 metabase
。
结尾为
如果文本的末尾与比较文本匹配,则返回 true。
默认执行区分大小写的匹配。您可以传递可选参数 "case-insensitive"
来执行不区分大小写的匹配。
语法: endsWith(text, comparison)
用于区分大小写的匹配。
endsWith(text, comparison, "case-insensitive")
用于不区分大小写的匹配。
示例: endsWith([Appetite], "hungry")
相关函数: startsWith, contains, doesNotContain。
主机
从 URL 或电子邮件中提取主机名,即域名和顶级域名。
语法: host(urlOrEmail)
。
示例: host([Page URL])
。如果 [Page URL]
列的值为 https://metabase.net.cn
,则 host([Page URL])
将返回 metabase.com
。host([Email])
将从 [email protected]
中提取 metabase.com
。
在列表中
如果 value1
等于 value2
(或 value3
等,如果指定),则返回 true。
in(value1, value2, ...)
value1
是要检查的列或值。
value2, ...
是要检查的列或值列表。
相关函数: contains, startsWith, endsWith。
为空
如果字符串列包含空字符串或为空,则返回 true。在非字符串列上调用此函数将导致错误。您可以将 isnull 用于非字符串列。
语法: isempty(column)
示例: isempty([Feedback])
如果 Feedback
是空字符串 (''
) 或不包含值,则返回 true。
左侧裁剪
从文本字符串中删除前导空格。
语法: ltrim(text)
示例: ltrim([Comment])
。如果注释为 " I'd prefer not to"
,则 ltrim
将返回 "I'd prefer not to"
。
长度
返回文本中的字符数。
语法: length(text)
示例: length([Comment])
。如果 comment
为 “wizard”,则 length
将返回 6(“wizard”有六个字符)。
小写
返回所有小写文本的字符串。
语法: lower(text)
。
示例: lower([Status])
。如果 Status
为 “QUIET”,则表达式将返回 “quiet”。
相关函数: upper。
非空
如果字符串列包含非空字符串的值,则返回 true。在非字符串列上调用此函数将导致错误。您可以将 notnull 用于非字符串列。
语法: notempty(column)
示例: notempty([Feedback])
如果 Feedback
包含非空字符串的值 (''
),则返回 true。
相关函数: isempty, isnull, notnull
正则提取
⚠️
regexextract
不适用于 MongoDB、SQLite 和 SQL Server。对于 Druid,regexextract
仅适用于 Druid-JDBC 驱动程序。
根据正则表达式提取匹配的子字符串。
语法: regexextract(text, regular_expression)
。
示例: regexextract([Address], "[0-9]+")
。
不支持 regexextract
的数据库:H2、SQL Server、SQLite。
相关函数: contains, doesNotContain, substring。
替换
将输入文本中所有出现的搜索文本替换为替换文本。
语法: replace(text, find, replace)
。
示例: replace([Title], "Enormous", "Gigantic")
。
右侧裁剪
从文本字符串中删除尾随空格。
语法: rtrim(text)
示例: rtrim([Comment])
。如果注释为 “Fear is the mindkiller. “,则表达式将返回 “Fear is the mindkiller.”。
起始为
如果文本的开头与比较文本匹配,则返回 true。默认执行区分大小写的匹配。您可以传递可选参数 "case-insensitive"
来执行不区分大小写的匹配。
语法: startsWith(text, comparison)
用于区分大小写的匹配。
startsWith(text, comparison, "case-insensitive")
用于不区分大小写的匹配。
示例: startsWith([Course Name], "Computer Science")
对于以 “Computer Science” 开头的课程名称(例如 “Computer Science 101: An introduction”)将返回 true。
对于 “Computer science 201: Data structures” 将返回 false,因为 “science” 的大小写与比较文本中的大小写不匹配。
startsWith([Course Name], "Computer Science", "case-insensitive")
对于 “Computer Science 101: An introduction” 和 “Computer science 201: Data structures” 都将返回 true。
相关函数: endsWith, contains, doesNotContain。
子域名
从 URL 中提取子域名。忽略 www
(返回空字符串)。
语法: subdomain(url)
。
示例: subdomain([Page URL])
。如果 [Page URL]
列的值为 https://status.metabase.com
,则 subdomain([Page URL])
将返回 status
。
子字符串
返回提供的文本的一部分,由起始位置和长度指定。
语法: substring(text, position, length)
示例: substring([Title], 1, 10)
返回字符串的前 10 个字母(字符串索引从位置 1 开始)。
相关函数: regexextract, replace。
裁剪
从文本字符串中删除前导和尾随空格。
语法: trim(text)
示例: trim([Comment])
将删除注释两侧的任何空格字符。
大写
返回所有大写文本的字符串。
语法: upper(text)
。
示例: upper([Status])
。如果状态为 “hyper”,则 upper("hyper")
将返回 “HYPER”。
日期函数
日期函数操作、提取或创建日期和时间值。
转换时区
将日期或时间戳值转换为指定的时区。
语法: convertTimezone(column, target, source)
。
示例: convertTimezone("2022-12-28T12:00:00", "Canada/Pacific", "Canada/Eastern")
将返回 2022-12-28T09:00:00
值,显示为 2022 年 12 月 28 日,上午 9:00
。
日期时间加
向日期或时间戳值添加一定的时间单位。
语法: datetimeAdd(column, amount, unit)
。
示例: datetimeAdd("2021-03-25", 1, "month")
将返回 2021-04-25
值,显示为 2021 年 4 月 25 日
。
amount
必须是整数,而不是小数。例如,您不能添加“半年”(0.5)。
相关函数: between, datetimeSubtract。
日期时间差
返回两个日期时间之间的时间差,以某个时间单位表示。例如,datetimeDiff(d1, d2, "day")
将返回 d1
和 d2
之间的天数。
语法: datetimeDiff(datetime1, datetime2, unit)
。
示例: datetimeDiff("2022-02-01", "2022-03-01", "month")
将返回 1
。
请参阅 datetimediff
的数据库限制。
日期时间减
从日期或时间戳值中减去一定的时间单位。
语法: datetimeSubtract(column, amount, unit)
。
示例: datetimeSubtract("2021-03-25", 1, "month")
将返回 2021-02-25
值,显示为 2021 年 2 月 25 日
。
amount
必须是整数,而不是小数。例如,您不能减去“半年”(0.5)。
相关函数: between, datetimeAdd。
日
获取日期时间并返回月份中的日期,以整数形式表示。
语法: day([datetime column])
。
示例: day("2021-03-25T12:52:37")
将返回日期,以整数形式表示,25
。
日名称
给定星期几的数字 (1-7),返回星期几的本地化名称。遵循每周的第一天设置。
语法: dayName(dayNumber)
。
示例: dayName(1)
将返回 Sunday
,除非您更改每周的第一天设置。
相关函数: quarterName, monthName。
小时
获取日期时间并返回小时,以整数形式表示 (0-23)。
语法: hour([datetime column])
。
示例: hour("2021-03-25T12:52:37")
将返回 12
。
间隔
检查日期列的值是否在相对范围内。
语法: interval(column, number, text)
。
示例: interval([Created At], -1, "month")
。
number
必须是整数。您不能使用小数。
相关函数: between。
分钟
获取日期时间并返回分钟,以整数形式表示 (0-59)。
语法: minute([datetime column])
。
示例: minute("2021-03-25T12:52:37")
将返回 52
。
月
获取日期时间并返回月份数字 (1-12),以整数形式表示。
语法: month([datetime column])
。
示例: month("2021-03-25T12:52:37")
将返回月份,以整数形式表示,3
。
月名称
返回给定月份的本地化短名称。
语法: monthName([Birthday Month])
示例: monthName(10)
将返回十月份的 Oct
。
相关函数: dayName, quarterName。
现在
使用您的 Metabase 报告时区返回当前日期和时间。
语法: now
。
季度
获取日期时间并返回一年中的季度数 (1-4),以整数形式表示。
语法: quarter([datetime column])
。
示例: quarter("2021-03-25T12:52:37")
将为第一季度返回 1
。
季度名称
给定季度数 (1-4),返回类似 Q1
的字符串。
语法: quarterName([Fiscal Quarter])
。
示例: quarterName(3)
将返回 Q3
。
相对日期时间
获取相对于当前时间的时间戳。
语法: relativeDateTime(number, text)
number
:时间间隔周期,负值表示过去的时间。number
必须是整数。您不能使用小数。
text
:时间间隔类型,如 "day"
、"month"
、"year"
relativeDateTime
只能用作条件表达式的一部分。
示例: [Orders → Created At] < relativeDateTime(-30, "day")
将过滤出当前日期 30 天前创建的订单。
相关函数: datetimeAdd, datetimeSubtract。
秒
获取日期时间并返回分钟中的秒数 (0-59),以整数形式表示。
语法: second([datetime column])
。
示例: second("2021-03-25T12:52:37")
将返回整数 37
。
timeSpan
获取指定长度的时间间隔。
语法: timeSpan(number, text)
。
number
:时间间隔周期,负值表示过去的时间。number
必须是整数。您不能使用小数。
text
:时间间隔类型,如 "day"
、"month"
、"year"
示例: [Orders → Created At] + timeSpan(7, "day")
将返回 Created At
日期后 7 天的日期。
周
获取日期时间并返回周数,以整数形式表示。
语法: week(column, mode)
。
示例: week("2021-03-25T12:52:37")
将返回周数,以整数形式表示,12
。
- column:日期或日期时间值列的名称。
- mode:可选。
- ISO:(默认)第 1 周从 1 月份第一个星期四之前的星期一开始。
- US:第 1 周从 1 月 1 日开始。所有其他周从星期日开始。
- Instance:第 1 周从 1 月 1 日开始。所有其他周从 Metabase 本地化设置中定义的日期开始。
请注意,在查询构建器中按年份的周进行汇总时,使用了不同的确定第一周的模式,有关更多信息,请参阅年份的周。
工作日
获取日期时间并返回整数 (1-7),表示星期几。
语法: weekday(column)
- column:日期时间列。
示例
case(
weekday([Created At]) = 1, "Sunday",
weekday([Created At]) = 2, "Monday",
weekday([Created At]) = 3, "Tuesday",
weekday([Created At]) = 4, "Wednesday",
weekday([Created At]) = 5, "Thursday",
weekday([Created At]) = 6, "Friday",
weekday([Created At]) = 7, "Saturday")
年
获取日期时间并返回年份,以整数形式表示。
语法: year([datetime column])
。
示例: year("2021-03-25T12:52:37")
将返回年份 2021,以整数形式表示,2021
。
窗口函数
窗口函数只能在汇总部分中使用。它们不能用于创建自定义列或自定义过滤器。
累计计数
有关更多信息,请查看我们关于累积函数的页面。
跨越分组的行的累加总数。
语法: CumulativeCount
。
示例: CumulativeCount
。
累计总和
有关更多信息,请查看我们关于累积函数的页面。
跨越分组的列的滚动总和。
语法: CumulativeSum(column)
。
示例: CumulativeSum([Subtotal])
。
偏移量
⚠️
Offset
函数目前不适用于 MySQL/MariaDB、MongoDB 和 Druid。
有关更多信息,请查看我们关于Offset的页面。
返回不同行中表达式的值。Offset
只能在查询构建器的“汇总”步骤中使用(您不能使用 Offset
创建自定义列)。
语法: Offset(expression, rowOffset)
expression
是要从不同行获取的值。
rowOffset
是相对于当前行的数字。例如,-1
表示上一行,或 1
表示下一行。
示例: Offset(Sum([Total]), -1)
将从上一行获取 Sum([Total])
值。
限制
- 聚合表达式只能在查询构建器的汇总部分中使用。
数据库限制
上面针对每个聚合和函数都注明了限制,这里总结如下
H2(包括 Metabase 示例数据库): Median
、Percentile
、convertTimezone
和 regexextract
。
Athena: convertTimezone
。
Databricks: convertTimezone
。
Druid: Median
、Percentile
、StandardDeviation
、power
、log
、exp
、sqrt
、Offset
。函数 regexextract
仅适用于 Druid-JDBC 驱动程序。
MongoDB: Median
、Percentile
、power
、log
、exp
、sqrt
、Offset
、regexextract
MariaDB: Median
、Percentile
、Offset
。
MySQL: Median
、Percentile
、Offset
。
Presto: convertTimezone
。仅为 Median
和 Percentile
提供近似结果。
Redshift: Average
将为整数列返回整数结果。
SparkSQL: convertTimezone
。
SQL Server: Median
、Percentile
和 regexextract
。
SQLite: exp
、log
、Median
、Percentile
、power
、regexextract
、StandardDeviation
、sqrt
和 Variance
。
Vertica: Median
和 Percentile
。
如果您正在使用或维护第三方数据库驱动程序,请参阅 wiki,了解您的驱动程序可能受到的影响。
请查看我们关于查询构建器中的自定义表达式的教程,以了解更多信息。
阅读其他Metabase 版本的文档。