Como incorporar SQL e fazer referência a objetos LookML

Para criar um LookML eficiente, você precisa referenciar dimensões, medidas, visualizações ou tabelas derivadas atuais, mesmo que elas não estejam no escopo atual. Você também precisa fazer referência a colunas na tabela subjacente e usar as chamadas de função do dialeto do seu banco de dados para manipular esses valores.

Operador de substituição ($)

O operador de substituição, $, torna o código LookML mais reutilizável e modular, permitindo que você faça referência a outras visualizações e tabelas derivadas, colunas em uma tabela SQL ou dimensões e medidas do LookML. Isso é bom por dois motivos. Primeiro, você já pode ter trabalhado com uma dimensão ou uma medida realmente complicada e não precisará escrever toda a complexidade novamente. Em segundo lugar, se você mudar algo sobre uma dimensão ou medida, essa mudança pode se propagar para todo o restante que depende dela.

Há várias maneiras de usar o operador de substituição:

${TABLE}.column_name faz referência a uma coluna na tabela que está conectada à visualização em que você está trabalhando. Exemplo:

dimension: customer_id {
  type: number
  sql: ${TABLE}.customer_id ;;
}

${field_name} faz referência a uma dimensão ou medida na visualização em que você está trabalhando. Exemplo:

measure: total_population {
  type: sum
  sql: ${population} ;;
}

${view_name.field_name} faz referência a uma dimensão ou medida a partir de outra visualização. Exemplo:

dimension: lifetime_orders {
  type: number
  sql: ${user_order_facts.lifetime_orders} ;;
}

${view_name.SQL_TABLE_NAME} faz referência a outra visualização ou tabela derivada. SQL_TABLE_NAME nesta referência é uma string literal, não é necessário substituí-la por nada. Exemplo:

explore: trips {
  view_label: "Long Trips"
  # This will ensure that we only see trips that are longer than average!
  sql_always_where: ${trips.trip_duration}>=(SELECT tripduration FROM ${average_trip_duration.SQL_TABLE_NAME});;
}

${view_name.SQL_TABLE_NAME} não funciona com o parâmetro sql_trigger usado com datagroups.

Escopo e nomeação

Você pode nomear o recurso "Explorar", "Visualizações", "Campos" e "Conjuntos". Os identificadores do Looker são escritos sem aspas.

Os campos e conjuntos do LookML têm nomes completos e nomes curtos:

  • Os nomes completos estão no formato <view>.<field-name | set-name>. O lado esquerdo indica o escopo, que é a visualização que contém o campo ou o conjunto. O lado direito especifica o campo específico ou o nome do conjunto.
  • Os nomes curtos têm o formato <field-name | set-name>, sem separação. O Looker expande os nomes curtos para nomes completos usando o escopo em que são usados.

Veja abaixo um exemplo que mostra muitas formas de nomes e escopo. Esse é um grupo de campos não realista, mas é mostrado para demonstrar diversas expressões de escopo possíveis.

view: orders {                   # "orders" becomes the containing scope
  measure: count {               # short name, equivalent to orders.count
    type: count
  }
  dimension: customer_id {       # short name, equivalent to orders.customer_id
    type: number
    sql: ${TABLE}.customer_id ;;
  }
  dimension: customer_address {  # short name, equivalent to orders.customer_address
    sql: ${customer.address} ;;  # full name, references a field defined in the "customer" view
  }
  set: drill_fields {            # short name, equivalent to orders.drill_fields
    fields: [
      count,                     # short name, equivalent to orders.count
      customer.id                # full name, references a field defined in the "customer" view
    ]
  }
}

Na declaração dimension: customer_address acima, a visualização subjacente do bloco SQL (customer) é diferente do escopo de visualização delimitada (orders). Isso pode ser útil quando você precisar comparar campos entre duas visualizações diferentes.

Quando uma visualização (que vamos chamar de "quot;view A"") se refere a um campo definido em uma visualização diferente (nós vamos chamá-la de "quot;view B""), há alguns itens a serem considerados:

  1. O arquivo de visualização B precisa ser incluído no mesmo modelo que a visualização A, usando o parâmetro include.
  2. A visualização B precisa ser mesclada para a visualização A em uma ou mais explorações. Consulte nossa página Como trabalhar com mesclagens no LookML para saber mais sobre mesclagens.

Dialeto SQL

O Looker oferece suporte a vários tipos de bancos de dados, como MySQL, Postgres, Redshift, BigQuery e assim por diante. Cada banco de dados é compatível com um conjunto de atributos ligeiramente diferente, com diferentes nomes de função, chamados de dialeto SQL.

O LookML foi projetado para funcionar com todos os dialetos SQL, e o LookML não prefere um dialeto em vez de outro. No entanto, será necessário incluir expressões de código SQL (conhecidas como blocos SQL) em determinados parâmetros LookML. Com esses parâmetros, o Looker transmite a expressão SQL diretamente para seu banco de dados, portanto, é necessário usar o dialeto SQL que corresponda ao seu banco de dados. Por exemplo, se você usar uma função SQL, ela precisa ser uma função compatível com o banco de dados.

Blocos SQL

Alguns parâmetros do LookML exigem que você forneça expressões SQL brutas para que o Looker possa entender como recuperar dados do seu banco de dados.

Os parâmetros LookML iniciados por sql_ esperam uma expressão SQL de algum formato. Por exemplo: sql_always_where, sql_on e sql_table_name. O parâmetro LookML mais comum para blocos de SQL é sql, usado em definições de campo de dimensão e medida para especificar a expressão SQL que define a dimensão ou medida.

O código especificado em um bloco do SQL pode ser tão simples quanto um único nome de campo ou tão complexo quanto uma subseleção correlacionada. O conteúdo pode ser bastante complexo e acomodar quase todas as suas necessidades de expressar a lógica de consulta personalizada em SQL bruto. Observe que o código usado nos blocos SQL precisa corresponder ao dialeto SQL usado pelo banco de dados.

Exemplo de bloqueios de SQL para dimensões e medidas

Veja abaixo exemplos de bloqueios de SQL para dimensões e medidas. O operador de substituição LookML ($) pode fazer com que essas declarações sql apareçam de forma enganosa, diferente do SQL. No entanto, após a substituição, a string resultante é SQL puro, que o Looker injeta na cláusula SELECT da consulta.

dimension: id {
  primary_key: yes
  sql: ${TABLE}.id ;;   # Specify the primary key, id
}
measure: average_cost {
  type: average
  value_format: "0.00"
  sql: ${order_items.cost} ;;   # Specify the field that you want to average
}
dimension: name {
  sql: CONCAT(${first_name}, ' ', ${last_name}) ;;
}
dimension: days_in_inventory {
  type: int
  sql: DATEDIFF(${sold_date}, ${created_date}) ;;
}

Conforme mostrado nas duas últimas dimensões acima, os blocos SQL podem usar funções compatíveis com o banco de dados subjacente, como as funções CONCAT e DATEDIFF do MySQL.

Exemplo de bloco SQL com uma subseleção correlacionada

É possível colocar qualquer instrução SQL em um bloco do SQL do campo, incluindo uma subseleção correlacionada. Veja um exemplo abaixo:

view: customers {
  dimension: id {
    primary_key: yes
    sql: ${TABLE}.id ;;
  }
  dimension: first_order_id {
    sql: (SELECT MIN(id) FROM orders o WHERE o.customer_id=customers.id) ;;
         # correlated subselect to derive the value for "first_order_id"
  }
}

Exemplo de bloco SQL para tabelas derivadas

As tabelas derivadas usam o bloco SQL para especificar a consulta que deriva a tabela. Veja um exemplo abaixo:

view: user_order_facts {
  derived_table: {
    sql:            # Get the number of orders for each user
      SELECT
        user_id
        , COUNT(&#42;) as lifetime_orders
      FROM orders
      GROUP BY 1 ;;
  }
  # later, dimension declarations reference the derived column(s)

  dimension: lifetime_orders {
    type: number
  }
}

Referências de tipos de campos do LookML

Ao referenciar um campo LookML atual em outro campo, é possível instruir o Looker para que ele trate o campo referenciado como um tipo de dados específico usando dois-pontos duplos (::) seguidos pelo tipo desejado. Por exemplo, se você referenciar a dimensão orders.created_date em outro campo, poderá usar a sintaxe ${orders.created_date::date} para garantir que o campo created_date seja tratado como um campo de data no SQL gerado pelo Looker, em vez de ser transmitido como uma string.

O tipo de dados que você pode usar em uma referência depende do tipo de dados do campo original referenciado. Por exemplo, se você está fazendo referência a um campo de string, o único tipo de dado que você pode especificar é ::string. Veja a lista completa de referências de tipo de campo permitidas que você pode usar para cada tipo de campo:

  • Em uma referência a um campo de string, use ::string.
  • Em uma referência a um campo de número, use ::string e ::number.
  • Em uma referência a um campo de data ou hora, é possível usar ::string, ::date e ::datetime.
    As referências que usam ::string e ::date retornam dados no fuso horário da consulta, enquanto as referências que usam ::datetime retornam dados no fuso horário do banco de dados.
  • Em uma referência a um campo "yesno", você pode usar ::string, ::number e ::boolean.
    Referências de campo que usam o tipo ::boolean não estão disponíveis para dialetos de bancos de dados incompatíveis com o tipo de dados booleanos.
  • Em uma referência a um campo de local, use ::latitude e ::longitude.

Como usar referências de tipo de campo LookML com campos de data

Por exemplo, imagine que você tenha uma dimensão enrollment_month e uma dimensão graduation_month, e ambas foram criadas em grupos de dimensões de type: time. Neste exemplo, a dimensão enrollment_month é produzida pelo seguinte grupo de dimensões de type: time:


dimension_group: enrollment {
  type: time
  timeframes: [time, date, week, month, year, raw]
  sql: ${TABLE}.enrollment_date ;;
}

Da mesma forma, a dimensão graduation_month é criada pelo seguinte grupo de dimensões da type: time:


dimension_group: graduation {
  type: time
  timeframes: [time, date, week, month, year, raw]
  sql: ${TABLE}.graduation_date ;;
}

Usando as dimensões enrollment_month e graduation_month, você pode calcular quantos meses ou anos passou entre a inscrição e a graduação de um aluno criando um grupo de dimensões de type: duration. No entanto, como alguns campos de data são convertidos como strings no SQL gerado pelo Looker, definir as dimensões enrollment_month e graduation_month como os valores de sql_start e sql_end pode resultar em um erro.

Para evitar que um erro resultante da transmissão desses campos de tempo seja uma string, uma opção é criar um grupo de dimensões de type: duration, fazendo referência aos períodos de raw a partir dos grupos de dimensões enrollment e graduation nos parâmetros sql_start e sql_end:


dimension_group: enrolled {
  type: duration
  intervals: [month, year]
  sql_start: ${enrollment_raw} ;;
  sql_end: ${graduation_raw} ;;
}

Na IU da ferramenta Explorar, um grupo de dimensões chamado Duração do registro é gerado, com as dimensões individuais Meses inscritos e Ano de registro.

Uma alternativa mais simples ao uso do período raw em um grupo de dimensões da type: duration é especificar o tipo de referência ::date ou ::datetime para os campos referenciados nos parâmetros sql_start e sql_end.


dimension_group: enrolled {
  type: duration
  intervals: [month, year]
  sql_start: ${enrollment_month::date} ;;
  sql_end: ${graduation_month::date} ;;
}

O LookML neste exemplo também cria um grupo de dimensões Duração do registro. No entanto, usar a referência ::date permite que as dimensões enrollment_month e graduation_month sejam usadas sem usar um período raw ou convertê-las como strings com SQL.

Para ver outro exemplo de como as referências de tipo de campo LookML podem ser usadas para criar grupos de dimensões personalizadas de type: duration, consulte a página de documentação de parâmetros dimension_group.

Essa sintaxe não está disponível com medidas de type: list, que não podem ser referenciadas a partir do Looker 6.8.

Constantes de LookML

O parâmetro constant permite especificar uma constante que pode ser usada em um projeto LookML. Com as constantes LookML, é possível definir um valor uma vez e referenciá-lo em qualquer parte do projeto em que as strings são aceitas, reduzindo a repetição no código LookML.

As constantes precisam ser declaradas em um arquivo de manifesto do projeto, e o valor de uma constante precisa ser uma string. Por exemplo, você pode definir uma constante city com o valor "Okayama" da seguinte maneira:

constant: city {
  value: "Okayama"
}

A constante city pode então ser referenciada em todo o projeto usando a sintaxe @{city}. Por exemplo, é possível usar a constante city com o parâmetro label em users Explore:


explore: users {
  label: "@{city} Users"
}

Em seguida, o Looker mostra Usuários do Okayama no menu Explorar e no título do Explorar, em vez do Usuários padrão.

Para mais informações e exemplos de como usar constantes LookML para escrever códigos reutilizáveis, consulte a página de documentação de parâmetros constant.