filters

本页引用了衡量中的 filters 参数。

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

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

filters 也可以用作信息中心元素的一部分。如需了解使用情形的示例,请参阅柱形图元素文档页面。

用量

视图:view_name {
measure: field_name {
filters: [dimension_name: "filter 表达式", dimension_name: "filter 表达式", ... ]
}
}
层次结构
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 的过滤条件表示法。将整个过滤条件表达式用引号括起来,如以下示例所示。

您还可以将 filters液体参数模板化过滤条件搭配使用,以创建具有可基于信息中心或 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 维度过滤

再举一个例子,假设数据中每个人各占一行,可以是正式员工,也可以是承包商。有一个类型为 yesno 的字段 is_contractor,如果该用户是承包商,则该字段包含 yes。此指标仅会对承包商进行统计:

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

添加多个过滤条件值

在下一个示例中,filters 表达式包含多个值。测量会统计与 state 字段中的四个值中的任意一个匹配的所有行:

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

添加数字过滤条件

在此示例中,为过滤器指定了数值。该衡量规则只会添加 price 大于 100 的订单:

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

使用高级过滤条件语法

在此示例中,为过滤器指定了一系列数值。该指标将统计 18-25 岁年龄段客户的订单总数:

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

创建动态过滤的衡量

在此示例中,过滤器让用户可以在“查看”或“信息中心”过滤器中查看订单计数(按用户选择的状态过滤):

首先,创建一个仅限过滤器的字段,以便用户选择值:

  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 搭配使用

许多用户尝试使用 filters 来测量 type: 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"]
}