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:
- Uma chave principal não exclusiva (mais comum)
- Utilização incorreta de
sql_distinct_key
- Referenciar um campo em várias visualizações quando existem distribuições envolvidas
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_distinct
pá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:
- Encontre a dimensão na métrica que combina valores de várias visualizações unidas.
- Encontrar as visualizações referenciadas por essa dimensão.
- Concatene as chaves primárias dessas visualizações de propriedade através da função de concatenação do dialeto de SQL.
- Coloque essa chave concatenada num parâmetro
sql_distinct_key
na medida que causou o problema.