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

Esta página vai ajudar você 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 a consulta envolve uma chave primária não exclusiva. Para especificar uma chave primária, use primary_key: yes em uma dimensão, que precisa ser uma dimensão sem valores repetidos.

Solução rápida

Depois de identificar as dimensões da chave primária na consulta, você pode testar 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 os valores não corresponderem, a chave primária não será exclusiva e vai aparecer em várias linhas. Você precisa escolher ou criar uma nova dimensão como chave primária. Se nenhuma dimensão tiver valores totalmente exclusivos, talvez seja 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 consulta for do tipo sum_distinct, talvez haja uma incompatibilidade de exclusividade entre os parâmetros sql_distinct_key e sql dessa medida.

Soluçã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 várias visualizações com ramificações

Sua consulta pode usar uma medida da visualização A, mas a medida 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 medida. Se a consulta envolver um fanout, essa 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 exclusiva, e as outras causas do problema não se aplicam à consulta, mas esse erro ainda ocorre. Primeiro, sua consulta vai envolver várias junções de relationship: one_to_many. Em segundo lugar, uma das medidas na consulta vai fazer 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. Concatenar as chaves primárias dessas visualizações usando a função de concatenação do dialeto SQL.
  4. Coloque essa chave concatenada em um parâmetro sql_distinct_key na medida que causou o problema.