Este é um tópico avançado voltado para usuários que já têm um bom conhecimento de SQL e LookML.
O Looker permite que os usuários manipulem as consultas criando filtros, que são baseados em dimensões e medidas. Embora esse método atenda a muitos casos de uso, ele não pode atender a todas as necessidades analíticas. Os filtros com modelos e os parâmetros do Liquid ampliam bastante os casos de uso possíveis.
Do ponto de vista do SQL, as dimensões e medidas só podem alterar as cláusulas WHERE
ou HAVING
mais externas na consulta. No entanto, talvez você queira permitir que os usuários manipulem outras partes do SQL. Ajustar parte de uma tabela derivada, ajustar qual tabela de banco de dados é consultada ou criar dimensões e filtros multiuso são apenas alguns dos recursos que você pode ativar com filtros de modelo e parâmetros Liquid.
Os filtros com modelos e os parâmetros do Liquid usam a linguagem de modelagem Liquid para inserir a entrada do usuário em consultas SQL. Primeiro, você usa um parâmetro do LookML para criar um campo com o qual os usuários possam interagir. Em seguida, use uma variável Liquid para injetar a entrada do usuário em consultas SQL.
Exemplos
Vamos conferir alguns exemplos para demonstrar o valor dos filtros com modelos e dos parâmetros líquidos.
Como criar uma tabela derivada dinâmica com um filtro de modelo
Considere uma tabela derivada que calcula o gasto vitalício de um cliente na região nordeste:
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
;;
}
}
Nessa consulta, é possível criar dimensões com base em customer_id
e lifetime_spend
. No entanto, suponha que você queira que o usuário possa especificar o region
, em vez de fixá-lo em "nordeste". O region
não pode ser exposto como uma dimensão, e, portanto, o usuário não pode filtrar normalmente.
Uma opção seria usar um filtro com modelo, que teria esta aparência:
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
}
}
Leia mais na seção Uso básico para conferir instruções detalhadas.
Como criar uma medida dinâmica com um parâmetro líquido
Considere uma medida filtrada que some o número de calças vendidas:
measure: pants_count {
filters: [category: "pants"]
}
Isso é simples, mas se houvesse dezenas de categorias, seria tedioso criar uma medida para cada uma delas. Além disso, isso pode atrapalhar a experiência da seção "Explorar" para os usuários.
Uma alternativa seria criar uma 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
}
Leia mais na seção Uso básico para conferir instruções detalhadas.
Uso básico
Etapa 1: criar algo para o usuário interagir
- Para filtros de modelo, adicione um
filter
. - Para parâmetros líquidos, adicione um
parameter
.
Em ambos os casos, esses campos vão aparecer para o usuário na seção Campos somente para filtro do seletor de campos.
Os campos filter
e parameter
podem aceitar uma série de parâmetros filhos, permitindo que você personalize a forma como eles funcionam. Consulte a página de documentação Parâmetros de campo para conferir uma lista completa. Há duas opções que têm menção especial para campos parameter
.
Primeiro, os campos parameter
podem ter um tipo especial chamado sem aspas:
parameter: table_name {
type: unquoted
}
Esse tipo permite que os valores sejam inseridos no SQL sem aspas, como uma string. Isso pode ser útil quando você precisa inserir valores SQL, como nomes de tabelas.
Em segundo lugar, os campos parameter
têm uma opção chamada valores permitidos, que permite associar um nome fácil de usar ao valor que você quer inserir. Exemplo:
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"
}
}
Etapa 2: aplicar a entrada do usuário
A segunda etapa é usar o Liquid para adicionar o filtro de modelo ou o parâmetro Liquid conforme desejado.
Filtros com modelos
A sintaxe dos filtros com modelos é dividida assim:
{% condition filter_name %} sql_or_lookml_reference {% endcondition %}
- As palavras
condition
eendcondition
nunca mudam. - Substitua
filter_name
pelo nome do filtro que você criou na primeira etapa. Você também pode usar uma dimensão se não tiver criado um campo somente de filtro. - Substitua
sql_or_lookml_reference
pelo SQL ou LookML que precisa ser "igual" à entrada do usuário. Isso será explicado com mais detalhes mais adiante nesta seção. Se você estiver usando o LookML, use a sintaxe${view_name.field_name}
do LookML.
No exemplo anterior, Como criar uma tabela derivada dinâmica com um filtro de modelo, usamos:
{% condition order_region %} order.region {% endcondition %}
É importante entender a interação entre as tags Liquid e o SQL que você escreve entre as tags. Essas tags de filtro com modelo são sempre transformadas em uma expressão lógica. Por exemplo, se o usuário digitar "Nordeste" no filtro order_region
, o Looker vai transformar essas tags em:
order.region = 'Northeast'
Em outras palavras, o Looker interpreta a entrada do usuário e gera a expressão lógica adequada.
Como os filtros de modelo retornam uma expressão lógica, eles podem ser usados com outros operadores e expressões lógicas válidos na instrução WHERE
do SQL. Usando o exemplo anterior, se você quisesse retornar todos os valores exceto a região selecionada pelo usuário, use o seguinte na instrução WHERE
:
NOT ({% condition order_region %} order.region {% endcondition %})
Também é válido usar um campo LookML como a condição do filtro. Todos os filtros aplicados diretamente ao campo do LookML vão determinar o valor da instrução 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 líquidos
A sintaxe dos parâmetros do Liquid é dividida assim:
{% parameter parameter_name %}
- A palavra
parameter
nunca muda. - Substitua
parameter_name
pelo nomeparameter
que você criou na primeira etapa.
Por exemplo, para aplicar a entrada do campo parameter
na primeira etapa, você pode criar uma medida assim:
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
}
Como escolher entre filtros de modelo e parâmetros do Liquid
Embora os filtros de modelo e os parâmetros do Liquid sejam semelhantes, há uma diferença importante entre eles:
- Os parâmetros líquidos inserem a entrada do usuário diretamente ou usam os valores definidos com valores permitidos.
- Os filtros com modelos inserem valores como instruções lógicas, conforme descrito na seção Filtros com modelos.
Em situações em que você quer oferecer aos usuários uma entrada mais flexível (como com vários tipos de períodos ou pesquisas de string), tente usar filtros de modelo sempre que possível. O Looker pode interpretar a entrada do usuário e gravar o SQL apropriado nos bastidores. Isso evita que você tenha que considerar todos os tipos possíveis de entrada do usuário.
Em situações em que uma instrução lógica não pode ser inserida ou quando você sabe que o usuário pode inserir um conjunto finito de opções, use parâmetros do Liquid.