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

Um de vários problemas pode causar este erro:

Chave principal não única

A causa mais comum deste erro é a sua consulta envolver uma chave primária não exclusiva. Especifica uma chave principal usando primary_key: yes numa dimensão, e tem de ser uma dimensão sem valores repetidos.

Solução rápida

Depois de identificar as dimensões da chave primária na sua consulta, pode testar a respetiva unicidade 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 principal é única. Se as contagens não corresponderem, a chave principal não é única e aparece em várias linhas. Tem de escolher ou criar uma nova dimensão como chave principal. Se nenhuma dimensão única contiver valores totalmente únicos, pode ter de concatenar campos para criar a sua própria dimensão de chave principal.

Usar row_number para gerar uma chave principal para uma tabela derivada

Se receber este erro com uma tabela derivada, pode usar a função de janela row_number() nas bases de dados Postgres e Redshift para criar um campo único. Este campo pode ser usado como chave principal:

  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, pode usar uma variável que itera todas as linhas 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 ;;
    }
  }
  

Utilização incorreta de sql_distinct_key

Se alguma das medidas na sua consulta for do tipo sum_distinct, pode haver uma falta de correspondência de unicidade entre os parâmetros sql_distinct_key e sql dessa medida.

Solução rápida

Consulte a nossa sum_distinctpágina de documentação para ver os requisitos destes parâmetros.

Referenciar campos em várias vistas com fanouts

A sua consulta pode usar uma medida da vista A, mas a medida faz referência a um campo da vista B. Nesta situação, o Looker usa a chave principal da vista A para calcular essa medida. Se a sua consulta envolver uma expansão, essa pode não ser a chave primária correta a usar. (Para se familiarizar com as distribuições, consulte a nossa publicação da comunidade relacionada.)

Solução rápida

Para resolver este problema, adicione a chave principal da vista B à métrica com problemas com o parâmetro sql_distinct_key.

O que acontece se nenhuma das causas indicadas se aplicar, mas o erro continuar a ocorrer?

Existe uma situação muito específica em que a chave principal pode ser única e as outras causas deste problema não se aplicam à sua consulta, mas este erro continua a ocorrer. Primeiro, a sua consulta vai envolver várias junções de relationship: one_to_many. Em segundo lugar, uma das medidas na sua consulta vai referenciar uma dimensão que combina valores de várias visualizações unidas.

Para corrigir este problema, tome nota dessa medida e, em seguida, siga estes passos:

  1. Encontre a dimensão na métrica que combina valores de várias visualizações unidas.
  2. Encontrar as visualizações referenciadas por essa dimensão.
  3. Concatene as chaves primárias dessas visualizações de propriedade através da função de concatenação do dialeto de SQL.
  4. Coloque essa chave concatenada num parâmetro sql_distinct_key na medida que causou o problema.