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
- Cómo hacer referencia a un campo en varias vistas cuando hay 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, utiliza primary_key: yes
en una dimensión, y esta debe ser una dimensión sin valores repetidos.
Solución rápida
Una vez que identifiques las dimensiones de clave primaria en tu consulta, podrás probarlas para determinar su exclusividad en el ejecutor de SQL de Looker con esta consulta:
SELECT COUNT(*), COUNT(DISTINCT your_primary_key) FROM your_table_name
Si los recuentos de 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 contiene valores completamente únicos, es posible que debas concatenar 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. Este campo se puede usar 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 itera 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
, es posible que haya una discrepancia de unicidad entre los parámetros sql_distinct_key
y sql
de esa medición.
Solución rápida
Consulta nuestra página de documentación de sum_distinct
para conocer estos parámetros y los requisitos de cumplimiento.
Cómo hacer referencia a campos en vistas con fanouts
Tu consulta puede usar una medida de la vista A, pero la medida 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 medida. Si tu consulta incluye un fanout, es posible que no sea la clave primaria correcta para usar. (Para familiarizarte con los fanouts, consulta nuestra publicación de Comunidad relacionada).
Solución rápida
Para resolver este problema, agrega la clave principal de la vista B a la medición del problema con el parámetro sql_distinct_key
.
¿Qué sucede si no se aplica ninguna de las causas enumeradas, pero el error persiste?
Hay una situación muy específica en la que tu clave principal puede ser única, y las otras causas de este problema no se aplican a tu consulta, pero este error se produce de todos modos. Primero, tu consulta involucrará varias uniones de relationship: one_to_many
. En segundo lugar, 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, a continuación, sigue estos pasos:
- Encuentra 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 esa clave concatenada en un parámetro
sql_distinct_key
en la medida que causó el problema.