Esta página te ayudará a solucionar este error de Looker:
Non-unique value/primary key (or sql_distinct_key), value overflow or collision when computing sum
Este error puede deberse a uno de varios problemas:
- Una clave primaria no única (más común)
- Uso incorrecto de
sql_distinct_key
- Hacer referencia a un campo en varias vistas cuando se involucran fanouts
Clave primaria no única
La causa más común de este error es que tu consulta involucra una clave primaria que no es única. Para especificar una clave primaria, usa primary_key: yes
en una dimensión, que debe ser una dimensión sin valores repetidos.
Solución rápida
Una vez que identifiques las dimensiones clave primaria en tu consulta, puedes probar la unicidad en el ejecutor de SQL de Looker con esta consulta:
SELECT COUNT(*), COUNT(DISTINCT your_primary_key) FROM your_table_name
Si los recuentos en esta consulta coinciden, la clave primaria es única. Si los recuentos no coinciden, la clave primaria no es única y aparece en varias filas. Deberás elegir o crear una dimensión nueva como clave primaria. Si ninguna dimensión única contiene valores únicos, es posible que debas concatenar los campos para crear tu propia dimensión de clave primaria.
Usa row_number
a fin de generar una clave primaria para una tabla derivada
Si recibes este error con una tabla derivada, puedes usar la función analítica row_number()
en las bases de datos de Postgres y Redshift para crear un campo único. Luego, puedes usar este campo como clave primaria:
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 ;; } }
En MySQL, puedes usar una variable que itere cada fila para lograr el mismo efecto:
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 incorrecto de sql_distinct_key
Si alguna de las mediciones de tu consulta es del tipo sum_distinct
, puede haber una discrepancia de singularidad entre los parámetros sql_distinct_key
y sql
de esa medida.
Solución rápida
Consulta nuestra página de documentación de sum_distinct
para conocer los requisitos de estos parámetros.
Referencia a campos en vistas con fanouts
Tu consulta puede usar una medida de la vista A, pero la medición hace referencia a un campo de la vista B. En esta situación, Looker usará la clave primaria de la vista A para calcular esa medición. Si tu consulta implica un fanout, es posible que esa no sea la clave primaria correcta que debes usar. (para familiarizarte con las fanouts, consulta nuestra publicación de Comunidad relacionada).
Solución rápida
Para resolver este problema, agrega la clave primaria de la vista B a la medición de problemas con el parámetro sql_distinct_key
.
¿Qué sucede si ninguna de las causas mencionadas se aplica, pero el error aún ocurre?
Existe una situación muy específica en la que tu clave primaria puede ser única, y las otras causas de este problema no se aplican a tu consulta, pero este error aún ocurre. Primero, tu consulta incluirá varias uniones de relationship: one_to_many
. Segundo, una de las mediciones de tu consulta hará referencia a una dimensión que combina valores de varias vistas unidas.
Para solucionar este problema, toma nota de esa medida y, luego, sigue estos pasos:
- Busca la dimensión dentro de la medición que combina valores de varias vistas unidas.
- Busca las vistas a las que hace referencia esa dimensión.
- Concatena las claves primarias de esas vistas usando la función de concatenación de tu dialecto SQL.
- Coloca la clave concatenada en un parámetro
sql_distinct_key
en la medición que causó el problema.