Filtros con plantillas y parámetros de Liquid

Este es un tema avanzado dirigido a usuarios que ya tienen un buen conocimiento de SQL y LookML.

Looker automáticamente les brinda a los usuarios la capacidad de manipular sus consultas creando filtros, que se basan en dimensiones y medidas. Si bien este método satisface muchos casos de uso, no puede satisfacer todas las necesidades analíticas. Los filtros basados en plantillas y los parámetros de Liquid amplían en gran medida los posibles casos de uso que puedes admitir.

Desde una perspectiva de SQL, las dimensiones y las medidas solo pueden alterar las cláusulas WHERE o HAVING más externas de tu consulta. Sin embargo, es posible que desees permitir que los usuarios manipulen otras partes del SQL. Ajustar parte de una tabla derivada, ajustar qué tabla de la base de datos se consulta o crear dimensiones y filtros polivalentes son solo algunas de las funciones que puedes habilitar con filtros basados en plantillas y parámetros de Liquid.

Los filtros basados en plantillas y los parámetros de Liquid usan el lenguaje de plantillas de Liquid para insertar la entrada del usuario en las consultas de SQL. Primero, usas un parámetro de LookML para crear un campo con el que los usuarios puedan interactuar. A continuación, usarás una variable de Liquid para insertar la entrada del usuario en las consultas de SQL.

Ejemplos

Veamos algunos ejemplos para demostrar el valor de los filtros basados en plantillas y los parámetros de Liquid.

Cómo crear una tabla derivada dinámica con un filtro basado en plantillas

Considera una tabla derivada que calcule la inversión total del cliente durante su ciclo de vida en la región noreste:

view: customer_facts {
  derived_table: {
    sql:
      SELECT
        customer_id,                        -- Can be made a dimension
        SUM(sale_price) AS lifetime_spend   -- Can be made a dimension
      FROM
        order
      WHERE
        region = 'northeast'                -- Can NOT be made a dimension
      GROUP BY 1
    ;;
  }
}

En esta consulta, puedes crear dimensiones a partir de customer_id y lifetime_spend. Sin embargo, supongamos que quieres que el usuario pueda especificar el region en lugar de codificarlo como "northeast". El region no se puede exponer como una dimensión y, por lo tanto, el usuario no puede filtrarlo de la manera habitual.

Una opción sería usar un filtro basado en plantillas, que se vería de la siguiente manera:

view: customer_facts {
  derived_table: {
    sql:
      SELECT
        customer_id,
        SUM(sale_price) AS lifetime_spend
      FROM
        order
      WHERE
        {% condition order_region %} order.region {% endcondition %}
      GROUP BY 1
    ;;
  }

  filter: order_region {
    type: string
  }
}

Obtén más información en la sección Uso básico para obtener instrucciones paso a paso.

Cómo crear una medida dinámica con un parámetro de Liquid

Considera una medida filtrada que sume la cantidad de pantalones vendidos:

measure: pants_count {
  filters: [category: "pants"]
}

Esto es sencillo, pero si hubiera docenas de categorías, sería tedioso crear una métrica para cada una. Además, puede sobrecargar la experiencia de Explorar para los usuarios.

Una alternativa sería crear una medida dinámica como esta:

measure: category_count {
  type: sum
  sql:
    CASE
      WHEN ${category} = '{% parameter category_to_count %}'
      THEN 1
      ELSE 0
    END
  ;;
}

parameter: category_to_count {
  type: string
}

Obtén más información en la sección de uso básico para obtener instrucciones paso a paso.

Uso básico

Paso uno: Crea algo con lo que el usuario pueda interactuar

  • En el caso de los filtros basados en plantillas, agrega un filter.
  • Para los parámetros de Liquid, agrega un parameter.

En cualquier caso, estos campos aparecerán para el usuario en la sección Campos de solo filtro del selector de campos.

Tanto el campo filter como el parameter pueden aceptar una serie de parámetros secundarios, lo que te permite personalizar su funcionamiento. Consulta la página de documentación Parámetros de campo para obtener una lista completa. Hay dos opciones que merecen una mención especial para los campos parameter.

En primer lugar, los campos de parameter pueden tener un tipo especial llamado sin comillas:

parameter: table_name {
  type: unquoted
}

Este tipo permite insertar valores en SQL sin estar encerrados entre comillas, como lo estaría una cadena. Esto puede ser útil cuando necesitas insertar valores de SQL, como nombres de tablas.

En segundo lugar, los campos parameter tienen una opción llamada valores permitidos que te permite asociar un nombre fácil de usar con el valor que deseas insertar. Por ejemplo:

  parameter: sale_price_metric_picker {
    description: "Use with the Sale Price Metric measure"
    type: unquoted
    allowed_value: {
      label: "Total Sale Price"
      value: "SUM"
    }
    allowed_value: {
      label: "Average Sale Price"
      value: "AVG"
    }
    allowed_value: {
      label: "Maximum Sale Price"
      value: "MAX"
    }
    allowed_value: {
      label: "Minimum Sale Price"
      value: "MIN"
    }
  }

Paso dos: Aplica la entrada del usuario

El segundo paso es usar Liquid para agregar el filtro basado en plantillas o el parámetro de Liquid según sea necesario.

Filtros basados en plantillas

La sintaxis de los filtros basados en plantillas se desglosa de la siguiente manera:

{% condition filter_name %} sql_or_lookml_reference {% endcondition %}
  • Las palabras condition y endcondition nunca cambian.
  • Reemplaza filter_name por el nombre del filtro que creaste en el primer paso. También puedes usar una dimensión si no creaste un campo solo para filtros.
  • Reemplaza sql_or_lookml_reference por el código SQL o LookML que debe establecerse como "igual" a la entrada del usuario (esto se explica con más detalle más adelante en esta sección). Si usas LookML, usa la sintaxis de ${view_name.field_name} LookML.

En el ejemplo anterior, Cómo crear una tabla derivada dinámica con un filtro basado en plantillas, usamos lo siguiente:

{% condition order_region %} order.region {% endcondition %}

Es importante comprender la interacción entre las etiquetas de Liquid y el código SQL que escribes entre ellas. Estas etiquetas de filtro basadas en plantillas siempre se transforman en una expresión lógica. Por ejemplo, si el usuario ingresó "Northeast" en el filtro order_region, Looker convertiría estas etiquetas en lo siguiente:

order.region = 'Northeast'

En otras palabras, Looker interpreta la entrada del usuario y genera la expresión lógica adecuada.

Dado que los filtros basados en plantillas devuelven una expresión lógica, puedes usarlos con otros operadores y expresiones lógicas que sean válidos en la instrucción WHERE de SQL. Con el ejemplo anterior, si quisieras devolver todos los valores excepto la región que seleccionó el usuario, podrías usar lo siguiente en la instrucción WHERE:

NOT ({% condition order_region %} order.region {% endcondition %})

También es válido usar un campo de LookML como condición de filtro. Cualquier filtro aplicado directamente al campo de LookML determinará el valor de la instrucción WHERE:

view: customer_facts {
  derived_table: {
    sql:
      SELECT
        customer_id,
        SUM(sale_price) AS lifetime_spend
      FROM
        order
      WHERE
        {% condition region %} order.region {% endcondition %}
      GROUP BY 1
    ;;
  }

  dimension: region {
    type: string
    sql: ${TABLE}.region ;;
}

Parámetros de Liquid

La sintaxis de los parámetros de Liquid se desglosa de la siguiente manera:

{% parameter parameter_name %}
  • La palabra parameter nunca cambia.
  • Reemplaza parameter_name por el nombre de parameter que creaste en el primer paso.

Por ejemplo, para aplicar la entrada del campo parameter del paso uno, puedes crear una métrica como esta:

  measure: sale_price_metric {
    description: "Use with the Sale Price Metric Picker filter-only field"
    type: number
    label_from_parameter: sale_price_metric_picker
    sql: {% parameter sale_price_metric_picker %}(${sale_price}) ;;
    value_format_name: usd
  }

Elegir entre filtros basados en plantillas y parámetros de Liquid

Aunque los filtros basados en plantillas y los parámetros de Liquid son similares, existe una diferencia importante entre ellos:

  • Los parámetros de Liquid insertan la entrada del usuario directamente (o con los valores que defines con valores permitidos).
  • Los filtros con plantilla insertan valores como instrucciones lógicas, como se describe en la sección Filtros con plantilla.

En situaciones en las que quieras ofrecer a los usuarios una entrada más flexible (como con varios tipos de períodos o búsquedas de cadenas), intenta usar filtros basados en plantillas siempre que sea posible. Looker puede interpretar la entrada del usuario y escribir el código SQL adecuado en segundo plano. Esto evita que tengas que tener en cuenta cada tipo posible de entrada del usuario.

En situaciones en las que no se puede insertar una instrucción lógica o en las que conoces un conjunto finito de opciones que el usuario podría ingresar, usa parámetros de Liquid.