Erro: valor não exclusivo/chave primária (ou sql_distinct_key), estouro de valor 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

Um dos vários problemas pode 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, que precisa ser uma dimensão sem valores repetidos.

Correção rápida

Depois de identificar as dimensões da chave primária na sua 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 as contagens nesta consulta corresponderem, a chave primária será única. Se as contagens não forem correspondentes, a chave primária não é única e aparece em várias linhas. Você precisará escolher ou criar uma nova dimensão como sua chave primária. Se nenhuma dimensão tiver valores totalmente exclusivos, talvez seja necessário concatenar os 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 Postgres e Redshift para criar um campo exclusivo. Esse campo pode ser usado como 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 para cada linha para ter 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 de exclusividade entre os parâmetros sql_distinct_key e sql dessa medida.

Correção rápida

Consulte nossa 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 medida faz referência a um campo da visualização B. Nessa situação, o Looker usará a chave primária da visualização A para calcular essa medida. Se sua consulta envolver um fanout, essa pode não ser a chave primária correta a ser usada. Para saber mais sobre os fanouts, confira nossa postagem relacionada na Comunidade.

Correção rápida

Para resolver esse problema, adicione a chave primária da visualização B à medição 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 sua 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 envolverá várias junções de relationship: one_to_many. Depois, uma das medidas da sua consulta vai fazer referência a uma dimensão que combina valores de várias visualizações agrupadas.

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 combinadas.
  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 seu dialeto SQL.
  4. Coloque essa chave concatenada em um parâmetro sql_distinct_key na medida que causou o problema.