Erro: valor/chave primária não exclusiva (ou sql_distinct_key), estouro de valor ou colisão ao calcular a soma

Esta página ajuda a resolver este erro do Looker:

  Non-unique value/primary key (or sql_distinct_key), value overflow or collision when computing sum

Vários problemas podem causar esse erro:

Chave primária não exclusiva

A causa mais comum desse erro é que sua consulta envolve uma chave primária não exclusiva. Você especifica uma chave primária usando primary_key: yes em uma dimensão, e ela precisa ser uma dimensão sem valores repetidos.

Solução rápida

Depois de identificar as dimensões da chave primária na consulta, teste a exclusividade delas no SQL Runner do Looker com esta consulta:

SELECT
  COUNT(*),
  COUNT(DISTINCT your_primary_key)
FROM
  your_table_name

Se os valores na consulta corresponderem, a chave primária será exclusiva. Se as contagens não forem correspondentes, a chave primária não será única e aparecerá em várias linhas. Será necessário escolher ou criar uma nova dimensão como sua chave primária. Se nenhuma dimensão tiver valores totalmente exclusivos, poderá ser necessário concatenar campos para criar sua própria dimensão de chave primária.

Como usar row_number para gerar uma chave primária para uma tabela derivada

Se você receber esse erro com uma tabela derivada, use a função de janela row_number() nos bancos de dados do Postgres e do Redshift para criar um campo exclusivo. Esse campo pode ser usado como uma chave primária:

  view: derived_table_name {
    derived_table {
      sql:
      SELECT
      row_number() OVER(ORDER BY created_at) AS prim_key,
      *
      FROM orders ;;
    }

    dimension: prim_key {
      type: number
      primary_key: yes
      sql: ${TABLE}.prim_key ;;
    }
  }
  

No MySQL, é possível usar uma variável que itera cada linha para conseguir o mesmo efeito:

  view: derived_table_name {
    derived_table {
     sql:
      SELECT
      CAST(@rownum := @rownum + 1 AS UNSIGNED) AS prim_key, t.*
      FROM orders t,
      (SELECT @rownum := 0) r ;;
    }

    dimension: prim_key {
      type: number
      primary_key: yes
      sql: ${TABLE}.prim_key ;;
    }
  }
  

Uso incorreto de sql_distinct_key

Se alguma das medidas na sua consulta for do tipo sum_distinct, pode haver uma incompatibilidade entre os parâmetros sql_distinct_key e sql dessa medida.

Correção rápida

Consulte a página de documentação do sum_distinct para conferir os requisitos desses parâmetros.

Como fazer referência a campos em visualizações com fanouts

Sua consulta pode usar uma medida da visualização A, mas a medição faz referência a um campo da visualização B. Nessa situação, o Looker vai usar a chave primária da visualização A para calcular essa métrica. Caso sua consulta envolva um fanout, essa pode não ser a chave primária correta a ser usada. Para saber mais sobre fanouts, confira nossa postagem relacionada na Comunidade.

Solução rápida

Para resolver esse problema, adicione a chave primária da visualização B à medida do problema com o parâmetro sql_distinct_key.

E se nenhuma das causas listadas se aplicar, mas o erro ainda ocorrer?

Há uma situação muito específica em que a chave primária pode ser única e as outras causas desse problema não se aplicam à sua consulta, mas esse erro ainda ocorre. Primeiro, sua consulta vai envolver várias junções de relationship: one_to_many. Segundo, uma das medições da consulta fará referência a uma dimensão que combina valores de várias visualizações mescladas.

Para corrigir esse problema, anote essa medida e siga estas etapas:

  1. Encontre a dimensão na medida que combina valores de várias visualizações mescladas.
  2. Encontre as visualizações referenciadas por essa dimensão.
  3. Concatene as chaves primárias dessas visualizações usando a função de concatenação do seu dialeto SQL.
  4. Coloque a chave concatenada em um parâmetro sql_distinct_key na medida que causou o problema.