Maximizar a reutilização de código com o DRY LookML: definir medidas reutilizáveis para cálculos complexos

Quando define cálculos complexos no LookML, pode ser útil dividi-los em passos intermédios que envolvem cálculos mais simples. Ao criar medidas intermédias, torna os seus cálculos mais legíveis, fáceis de manter e menos propensos a erros, uma vez que só tem de garantir que cada cálculo intermédio está correto num único local.

Esta página oferece um exemplo de como pode tornar os seus cálculos no LookML mais legíveis e fáceis de manter definindo medidas intermédias para dividir cálculos complexos em passos mais pequenos e mais fáceis de gerir.

Ingredientes

Pré-requisitos

Exemplo: dividir um cálculo complexo em medidas intermédias

Suponhamos que tem uma empresa que vende produtos online e quer definir medidas para calcular o lucro total e os dividendos dos acionistas. Uma forma de o fazer é definir duas medidas: uma medida total_profit e uma medida shareholder_dividends, da seguinte forma:


measure: total_profit {
  type: number
  sql: SUM(${orders.sale_price}) - SUM(${employees.salary}) - SUM(${products.cost}) ;;
}

measure: shareholder_dividends
  description: "We give shareholders 60% of our total profits."
  type: number
  sql: 0.6 * (SUM(${orders.sale_price}) - SUM(${employees.salary}) - SUM(${products.cost})) ;;

Neste exemplo, o cálculo SUM(${orders.sale_price}) - SUM(${employees.salary}) - SUM(${products.cost}) é reutilizado no parâmetro sql para ambas as medidas. Se precisar de atualizar a definição deste cálculo, por exemplo, para corrigir um erro, tem de atualizar o cálculo manualmente para ambas as métricas.

Pode facilitar a manutenção destas definições de medidas reutilizando a medida total_profit no cálculo da medida shareholder_dividends:


measure: total_profit {
  type: number
  sql: SUM(${orders.sale_price}) - SUM(${employees.salary}) - SUM(${products.cost}) ;;
}

measure: shareholder_dividends
  description: "We give shareholders 60% of our total profits."
  type: number
  sql: 0.6 * ${total_profit} ;;

Pode querer dividir o cálculo em total_profit em medidas ainda mais simples que podem ser reutilizadas noutros cálculos. Por exemplo, pode criar medidas de type: sum denominadas total_sales, total_revenue, total_cost e total_salary:


measure: total_sales {
  hidden: yes
  type: sum
  sql: ${orders.sale_price} ;;
}

measure: total_revenue {
  hidden: yes
  type: number
  sql: ${total_sales} ;;
}

measure: total_cost {
  hidden: yes
  type: sum
  sql: ${products.cost} ;;
}

measure: total_salary {
  hidden: yes
  type: sum
  sql: ${employees.salary} ;;
}

Em seguida, pode reutilizar os campos intermédios que definiu da seguinte forma:


measure: total_expenses {
  type: number
  sql: ${total_cost} + ${total_salary} ;;
}

measure: total_profit {
  type: number
  sql: ${total_revenue} - ${total_expenses} ;;
}

measure: shareholder_dividends {
  description: "We give shareholders 60% of our total profits."
  type: number
  sql: 0.6 * ${total_profit} ;;
}

Embora tenha definido mais medidas, estas medidas intermédias podem ser reutilizadas noutros cálculos, e é mais fácil corrigir um erro ou fazer alterações aos cálculos usados em várias medidas.