过滤条件(针对字段)

本页介绍的是属于衡量指标filters 参数。

filters 还可以用作原生派生表的一部分,如 explore_source 参数文档页面中所述。

filters 还可以用作信息中心的一部分,如信息中心参数文档页面中所述。

filters 还可以用作信息中心元素的一部分。如需查看其使用情况的代表性示例,请参阅柱状图元素的文档页面。

用法

view: view_name {
  measure: field_name {
    filters: [dimension_name: "filter expression", dimension_name: "filter expression", ... ]
  }
}
层次结构
filters
可能的字段类型
测量

接受
一组维度名称和相应的 Looker 过滤表达式

定义

filters 是一个可选的过滤表达式列表,用于应用于指标计算。它仅适用于执行聚合的以下衡量类型:

  • type: count
  • type: count_distinct
  • type: sum
  • type: average

过滤条件的语法如下:

filters: [dimension_name_1: "Looker filter expression", dimension_name_2: "Looker filter expression", ...]

如需详细了解如何编写有效的过滤表达式,请参阅 Looker 的过滤条件表示法。将整个过滤条件表达式放在英文引号中,如以下示例所示。

您还可以将 filtersLiquid 参数模板化过滤条件搭配使用,以创建动态过滤的测量,其过滤值可以根据用户在信息中心或 Look 中的输入动态变化。这种方法允许用户选择仅适用于特定指标的过滤条件值,而无需在全局 WHERE 子句中过滤整个查询。如需了解详情,请参阅本页后面的创建动态过滤后的度量部分。

示例

您可以通过多种方式将 filters 用于衡量指标。以下示例概述了一些常见应用场景的解决方案。

按多个字段进行过滤

在此示例中,该指标将统计过去 7 天内创建的且不属于已停用账号的用户的不同 ID。此示例还展示了如何向字段添加多个过滤条件。每个过滤表达式都需要有自己的完整 filters 参数:

measure: this_week_count {
  type: count_distinct
  sql: ${TABLE}.id ;;
  filters: [created_date: "7 days", user.status: "-disabled"]
  # Reference fields from other joined views with view_name.field_name syntax
  # Minus sign means "not" in this case, but check notation docs for details
}

yesno 维度过滤

再举一个例子,假设某数据包含的每行数据对应一个人,此人要么是正式员工,要么是合同工。有一个字段 is_contractor,其类型为 yesno,如果此人是承包商,则包含 yes。此衡量指标将仅统计承包商的行数:

measure: contractor_count {
  type: count
  filters: [is_contractor: "yes"]
}

添加多个过滤条件值

在下一个示例中,filters 表达式包含多个值。该指标将统计 state 字段中与以下四个值中的任何一个匹配的所有行:

measure: customers_by_state {
  type: count
  filters: [state: "California, Nevada, Washington, Oregon"]
}

过滤 NULL 个值

在此示例中,该度量会统计过去 7 天内创建且 user.email_address 字段中包含非 NULL 值的不同 ID:

measure: this_week_count_with_email {
  type: count_distinct
  sql: ${TABLE}.id ;;
  filters: [created_date: "7 days", user.email_address: "-NULL"]
}

由于字段 user.email_address 的类型为 string,因此使用 "-NULL" 语法。如需了解详情,请参阅 Looker 过滤条件表达式文档页面。

添加数值过滤条件

在此示例中,过滤条件具有数值。该指标将仅添加 price 大于 100 的订单:

measure: total_amt_large_orders {
  type: sum
  filters: [orders.price: ">100"]
  sql: ${orders.price} ;;
}

使用 AND 合并条件

在此示例中,该指标使用包含 AND 运算符的过滤表达式来计算年龄在 18-25 岁之间的客户的总订单数:

measure: sales_18_to_25 {
  type: sum
  filters: [customers.age: ">=18 AND <=25"]
  sql: ${orders.price} ;;
}

使用逗号组合条件

在此示例中,该度量使用包含 , 运算符的过滤表达式来计算年龄小于 25 岁或大于 65 岁的客户的总订单数:

measure: sales_less_25_or_greater_65 {
  type: sum
  filters: [customers.age: "<25, >65"]
  sql: ${orders.price} ;;
}

创建动态过滤的指标

在此示例中,过滤条件可让用户在 Look 或信息中心过滤条件中选择按状态过滤订单数量:

首先,创建一个允许用户选择值的仅限过滤的字段

  filter: status_filter {
    type: string
    suggest_dimension: status
  }

接下来,创建一个隐藏维度,利用模板化过滤条件来捕获用户从上一个仅包含过滤条件的字段中做出的选择。只要在过滤条件字段中选择了一个值,此维度就会返回 yes

  dimension: status_satisfies_filter {
    type: yesno
    hidden: yes
    sql: {% condition status_filter %} ${status} {% endcondition %} ;;
  }

最后,创建一个基于 type: yesno 维度进行过滤的度量:

  measure: count_dynamic_status {
    type: count
    filters: [status_satisfies_filter: "yes"]
  }

如果用户选择不为仅限过滤条件的字段选择值,SQL 将默认设置为 1=1,这不会影响度量值。

常见挑战

请勿将 filterstype: number 的衡量指标搭配使用

许多用户尝试将 filterstype: number 的指标搭配使用,但这是行不通的:

# Will NOT work
measure: total_food_profit {
  type: number
  sql: ${total_revenue} - ${total_cost} ;;
  filters: [segment: "food"]
}
measure: total_revenue {
  type: sum
  sql: ${revenue} ;;
}
measure: total_cost {
  type: sum
  sql: ${cost} ;;
}

请改为将 filters 参数应用于构成 type: number 指标的任何单个指标,如下所示:

# Will work
measure: total_food_profit {
  type: number
  sql: ${total_food_revenue} - ${total_food_cost} ;;
}
measure: total_food_revenue {
  type: sum
  sql: ${revenue} ;;
  filters: [segment: "food"]
}
measure: total_food_cost {
  type: sum
  sql: ${cost} ;;
  filters: [segment: "food"]
}