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:
- Uma chave primária não exclusiva (mais comum)
- Uso incorreto de
sql_distinct_key
- Referência a um campo nas visualizações quando há fanouts
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:
- Encontre a dimensão na medida que combina valores de várias visualizações combinadas.
- Encontre as visualizações referenciadas por essa dimensão.
- Concatenar as chaves primárias dessas visualizações usando a função de concatenação do seu dialeto SQL.
- Coloque essa chave concatenada em um parâmetro
sql_distinct_key
na medida que causou o problema.