创建 Looker 表达式

Looker 表达式

Looker 表达式(有时称为 Lexp)用于针对以下对象执行计算:

Looker 表达式由以下元素的组合构成:

  • NULL::值 NULL 表示没有数据,当您想检查某个内容是否为空或不存在时,此值非常有用。

  • 常量:常量是指您提供的不变值。7 等数字或 Completed 等字符串是常量。

  • Looker 字段:对 Looker 字段的引用,包括维度、度量和表计算。

  • Looker 运算符:运算符有多种类型(如 Looker 函数和运算符文档页面中所列):

    • 数学运算符(例如 +-*/
    • 比较运算符(例如 =><=
    • 逻辑运算符(例如 ANDORNOT
  • Looker 函数:这些函数在性质上与 Excel 函数类似。您可以使用函数以复杂的方式转换数据或引用数据。所有可用函数均列在 Looker 函数和运算符文档页面上。

创建 Looker 表达式

表计算自定义字段自定义过滤条件使用 Looker 表达式编辑器。在您输入表达式时,Looker 会提示您可能要使用的函数、运算符和字段名称。

查看所有建议

在探索中创建表格计算自定义字段自定义过滤条件,即可访问 Looker 表达式编辑器。

输入一个空格,即可查看可供选择的所有字段、函数和运算符的列表。如果某个字段当前在“探索”中处于选中状态,Looker 会在该字段的左侧显示一个黑点,并将该字段显示在列表顶部。

在 Looker 表达式编辑器中开始输入内容,以将列表缩短为您感兴趣的项目。

自定义字段编辑器会显示当前正在使用的探索字段(如果这些字段与自定义字段的函数兼容)。

添加字段

如需在表达式中添加 Looker 字段,请开始输入该字段的名称。随着您的输入,编辑器会将搜索范围缩小到包含您输入内容的字段和函数列表。您可以输入字段在“探索”页面上显示的名称,也可以使用其 LookML 名称(如果您知道的话)。

当您从列表中选择某个字段时,Looker 会使用 LookML 名称(格式为 ${view_name.field_name})将其添加到表达式中。这样可确保表达式中的所有字段都具有唯一的名称。

添加总计

如果您要创建基于显示总计的探索的表达式,还可以在表达式中添加列总计和行总计。列总计会显示在编辑器中,并在字段名称的 LookML 迭代版本前面显示“总计”字样。例如,对于名为“数量”的字段,Looker 会将该字段的列总数命名为“总数量”。Count - Total

总计的 LookML 名称采用 ${view_name.field_name:total} 格式,其中 :total 添加在字段名称的末尾。

对于行总计,编辑器中的字段名称前面会显示“行总计”字样;并且在字段的 LookML 名称中,字段名称末尾会添加 :row_total,例如 ${view_name.field_name:row_total}

添加运算符

您可以根据需要向表达式添加 ANDORNOT 等逻辑运算符。通常情况下,系统会先评估 AND 运算符,然后再评估 OR 运算符,但您可以使用英文圆括号来替换此行为。您还可以使用比较运算符(例如 >=<=)和数学运算符(例如 +*)。

当您将光标悬停在某个运算符上时,信息窗格中会显示有关正确使用的注释。

添加函数

如需在表达式中添加 Looker 函数,请开始输入函数名称。随着您的输入,编辑器会将搜索范围缩小到包含您输入内容的字段和函数列表。

函数可能由需要特定类型的实参(或变量)构成,例如字段、数字或“是/否”。将光标悬停在函数上时,您可以查看信息窗格中表达式旁边显示的注释,了解需要提供哪些实参以及这些实参需要是什么类型。

您可以在 Looker 函数和运算符文档页面上查看 Looker 提供的完整函数列表。

使用错误提示和信息窗格

Looker 会在 Looker 表达式编辑器旁边显示一个信息窗格。此窗格提供文档和建议,尤其是在表达式中存在错误时。

表达式编辑器旁边的信息窗格提供以下信息:

  • 突出显示错误:Looker 会用红色下划线标记表达式中尚未正确的部分。

  • 建议和错误详情:Looker 会针对您接下来要在表达式中添加的内容提供建议。如果出现错误,系统会说明错误原因。如果存在多个错误,系统会根据光标所在的位置向您显示相应的错误。

  • 文档:Looker 会根据光标位置显示您正在使用的函数或运算符的相关文档。例如,当您输入 if() 函数的第一个实参时,Looker 会提供信息,指出第一个实参的评估结果应为 true 或 false。您可以点击函数名称,以导航到相应函数的文档。

包括注释

您可以在 Looker 表达式中添加注释,只需在表达式编辑器中以 # 开头即可。

使用字段

有时,您可能需要在表达式中使用字段(维度、指标或表格计算)的值。您可能需要将该字段的值添加到其他内容中、检查该值是否为特定值、将其纳入函数中,或者执行许多其他操作。

本页前面所述,您可以在表达式编辑器中输入字段名称,Looker 会帮助您找到引用该字段的正确方式。向表达式添加字段时,Looker 会使用该字段的 LookML 标识符,该标识符类似于 ${view_name.field_name}。输入字段名称(如字段选择器中所示),表达式编辑器将同时显示字段选择器名称和 LookML 标识符。

您可以通过多种方式检索值:

  • 从同一行获取值:使用字段的最基本方式是直接引用它。例如,您的表达式可能使用 ${product.category}。执行此操作时,您相当于在说“对于任何给定的行,请从该行中获取商品类别”。

  • 从其他行获取值:您还可以从其他行获取字段的值。例如,您可能需要“对于任何给定的行,从上一行中获取商品类别”这样的逻辑。为此,您可以使用偏移函数(请参阅此位置函数列表)。偏移函数可能如下所示:offset(${product.category}, -1)

  • 从透视列中获取值:您还可以从透视列中获取值。例如,您可能需要以下逻辑:“对于任何给定的行,从第一个透视列中获取‘总销售额’。”如需使用透视列,您需要使用透视函数(请参阅此透视函数列表)。透视函数可能如下所示:pivot_index(${order.total_sales}, 1)

  • 获取行或列的总计:如果您已向探索添加总计,则可以使用 ${field_name:total} 格式,在字段名称中添加 :total(用于列总计)或 :row_total(用于行总计),从而获取列或行的总计值。例如,如果您想获得订单数量占总数的百分比,可以创建如下表计算:${orders.count} / ${orders.count:total}

使用运算符

Looker 表达式可以包含逻辑运算符、比较运算符和数学运算符,以创建不同的条件:

  • 逻辑运算符(例如 ANDORNOT
  • 比较运算符(例如 ><
  • 数学运算符(例如 +-

除非您使用括号另行指定,否则系统会先考虑 AND 逻辑,然后再考虑 OR 逻辑。以下不带额外括号的表达式:

if (
  ${order_items.days_to_process}>=4 OR
  ${order_items.shipping_time}>5 AND
  ${order_facts.is_first_purchase},
"review", "okay")

求值结果为:

if (
  ${order_items.days_to_process}>=4 OR
  (${order_items.shipping_time}>5 AND ${order_facts.is_first_purchase}),
"review", "okay")

在 Looker 中,您应使用 yesno,而不是 truefalse。这些逻辑常量与用引号括起来的字词 "yes""no" 不同。如需了解详情,请参阅逻辑常量说明

使用函数

Looker 表达式通常包含一个或多个函数,可帮助您检索特定数据或计算特定内容。它们在性质上与 Excel 函数类似。

函数采用名称后跟一对圆括号的形式,例如:my_function()。您可能需要在这些圆括号内提供信息,并以英文逗号分隔。这些信息称为“实参”,其格式如下:my_function(argument_1, argument_2)

例如,now 函数不接受任何实参,但会返回当前日期和时间。使用方式如下:now()

round 函数确实接受一个实参,即一个数字。使用方式如下:round(3.2)。结果为 3

您可以通过以下两种方式了解需要提供哪些实参(如果有):

  • 表达式编辑器旁边的信息窗格会显示有关您正在编写的函数的一些文档。您可以点击函数的名称以前往其文档。
  • 您还可以直接前往 Looker 函数和运算符文档页面,查找要使用的函数。

假设有一个 contains 函数,其文档如下所示:

函数 语法 用途
包含 contains(string, search_string) 如果 string 包含 search_string,则返回 Yes;否则返回 No

您可以看到,需要提供两个实参。它们的名称为 stringsearch_string,但这并不意味着您需要在函数中输入确切的字词“string”和“search_string”。这些只是实参的名称,您需要将其替换为其他内容。通过阅读用途,我们可以看出 string 应该是我们想要搜索的字段或其他值,而 search_string 是我们想要搜索的内容。例如:

contains(${customer.feedback_text}, "great")

如果客户反馈中包含“great”一词,则此函数会返回 Yes。否则,结果为 No

您可以将函数放在其他函数中,以处理复杂的逻辑。只要内部函数的结果适合外部函数的实参,该函数就会正常运行。例如:

contains(
  if(
    is_null(${customer.feedback_text}),
    ${customer.comment_text},
    ${customer.feedback_text}
  ),
"great")

is_null 函数嵌套在 if 函数内,而 if 函数本身又位于 contains 函数内。其运作方式如下:

  1. is_null() 函数用于检查客户反馈文本。
  2. 接下来,if() 函数使用该结果,并返回客户反馈文本(如果有),否则返回客户评论文本。
  3. 最后,contains() 函数使用 if() 函数返回的文本,并在其中搜索“great”一词。

从逻辑上讲,此表达式的含义是:“如果有客户反馈,则在其中进行搜索。如果找不到,请改为在客户评论中搜索。在这两种情况下,都查找“great”一词。