Este é um tópico avançado que pressupõe um bom conhecimento preexistente do SQL e do LookML.
O Looker fornece automaticamente aos usuários a capacidade de manipular suas consultas criando filtros, que são baseados em dimensões e medidas. Embora esse método simples atenda a muitos casos de uso, ele não consegue atender a todas as necessidades analíticas. Os filtros de modelo e os parâmetros Liquid expandem amplamente os casos de uso possíveis aos quais você pode oferecer suporte.
Da perspectiva do SQL, as dimensões e medidas só podem alterar as cláusulas WHERE
ou HAVING
mais externas na sua 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 de modelo e os parâmetros Liquid usam a linguagem de modelos Liquid para inserir a entrada do usuário em consultas SQL. Primeiro, use um parâmetro LookML para criar um campo para os usuários interagirem. Em seguida, use uma variável Liquid para injetar a entrada do usuário em consultas SQL.
Examples
Vejamos alguns exemplos para demonstrar o valor dos filtros de modelo 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 total de um cliente, dentro da 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
;;
}
}
Nesta consulta, você pode criar dimensões a partir de customer_id
e lifetime_spend
. No entanto, suponha que você queira que o usuário possa especificar o region
, em vez de codificá-lo como "nordeste". A region
não pode ser exposta como uma dimensão e, portanto, o usuário não pode filtrá-la normalmente.
Uma opção seria usar um filtro de modelo com 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 abaixo para instruções passo a passo.
Se uma tabela derivada usar um filtro com modelo, não será possível tornar a tabela permanente.
Como fazer uma medida dinâmica com um parâmetro Liquid
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. Além disso, a experiência "Explorar" pode ficar confusa 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 abaixo para instruções passo a passo.
Uso básico
Etapa 1: criar algo para interação do usuário
- Para filtros com modelo, adicione um
filter
. - Para parâmetros líquidos, adicione um
parameter
.
Em ambos os casos, esses campos aparecerão para o usuário na seção Campos somente para filtros do seletor de campo.
Os campos filter
e parameter
podem aceitar uma série de parâmetros filhos, permitindo que você personalize como eles funcionam. Consulte a página de documentação dos parâmetros de campo para uma lista completa. Há duas opções com referências especiais 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 ficar entre aspas, como seria uma string. Isso pode ser útil quando você precisa inserir valores SQL, como nomes de tabela.
Segundo, os campos parameter
têm uma opção chamada valores permitidos, que permite associar um nome fácil com o valor que você quer inserir. Exemplo:
parameter: sale_price_metric_picker {
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 Liquid para adicionar o filtro de modelo ou o parâmetro Liquid conforme desejado.
Filtros com modelo
A sintaxe dos filtros de modelo é dividida da seguinte maneira:
{% 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 filtros. - Substitua
sql_or_lookml_reference
pelo SQL ou LookML que precisa ser definido como "igual" à entrada do usuário. Leia mais detalhes abaixo. Se estiver usando LookML, use a sintaxe LookML${view_name.field_name}
.
No exemplo acima, usamos:
{% condition order_region %} order.region {% endcondition %}
É importante entender a interação entre as tags Liquid e o SQL que você escreve entre elas. As tags de filtro com modelo são sempre transformadas em uma expressão lógica. Por exemplo, se o usuário digitasse "Nordeste" no filtro order_region
, o Looker transformaria essas tags em: order.region = 'Northeast'
. Em outras palavras, o Looker entende a entrada do usuário e gera a expressão lógica apropriada.
Esse é um ponto de confusão entre os desenvolvedores do Looker. Os filtros de modelo sempre resultam em uma expressão lógica de algum tipo, e não no valor individual inserido pelo usuário.
Como os filtros de modelo retornam uma expressão lógica, é possível usá-los com outros operadores lógicos e expressões lógicas válidas na instrução WHERE
do SQL. Usando o exemplo acima, se você quiser retornar todos os valores, exceto a região que o usuário selecionou, poderá usar 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 LookML determinam 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 Liquid é dividida da seguinte forma:
{% parameter parameter_name %}
- A palavra
parameter
nunca muda. - Substitua
parameter_name
pelo nome doparameter
que você criou na primeira etapa.
Por exemplo, para aplicar a entrada do campo parameter
na primeira etapa acima, você pode criar uma medida como esta:
measure: sale_price_metric {
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 líquidos
Embora os filtros de modelo e os parâmetros Liquid sejam semelhantes, há uma diferença importante entre eles:
- Parâmetros líquidos: inserem a entrada do usuário diretamente ou usando os valores definidos com valores permitidos.
- Os filtros com modelo inserem valores como instruções lógicas, conforme descrito acima.
Em situações em que você deseja oferecer aos usuários uma entrada mais flexível (como com vários tipos de período ou pesquisas de strings), tente usar filtros com modelo quando possível. O Looker pode interpretar a entrada do usuário e escrever o SQL apropriado em segundo plano. Isso evita que você tenha que considerar cada tipo possível de entrada do usuário.
Em situações em que uma instrução lógica não pode ser inserida ou em que você conhece um conjunto finito de opções que o usuário pode inserir, use os parâmetros Liquid.