Error: Valor no único/clave primaria (o sql_distinct_key), desbordamiento de valores o colisión cuando se calcula la suma

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:

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:

  1. Encuentra la dimensión dentro de la medición que combina valores de varias vistas unidas.
  2. Busca las vistas a las que hace referencia esa dimensión.
  3. Concatena las claves primarias de esas vistas usando la función de concatenación de tu dialecto SQL.
  4. Coloca esa clave concatenada en un parámetro sql_distinct_key en la medida que causó el problema.