Error: valor o clave principal no únicos (o sql_distinct_key), desbordamiento de valor o colisión al calcular 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 varios problemas:

Clave principal no única

La causa más habitual de este error es que tu consulta incluye una clave principal no única. Para especificar una clave principal, debe usar primary_key: yes en una dimensión. Además, debe ser una dimensión sin valores repetidos.

Solución rápida

Una vez que hayas identificado las dimensiones de clave principal en tu consulta, puedes comprobar si son únicas en SQL Runner 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 principal es única. Si los recuentos no coinciden, la clave principal no es única y aparece en varias filas. Deberá elegir o crear una dimensión como clave principal. Si ninguna dimensión contiene valores completamente únicos, puede que tenga que concatenar campos para crear su propia dimensión de clave principal.

Usar row_number para generar una clave principal de una tabla derivada

Si recibes este error con una tabla derivada, puedes usar la función de ventana row_number() en las bases de datos de PostgreSQL y Redshift para crear un campo único. Este campo se puede usar como clave 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 ;;
    }
  }
  

En MySQL, puedes usar una variable que itere cada fila para conseguir 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 medidas de su consulta es de tipo sum_distinct, puede que haya una discrepancia de unicidad entre los parámetros sql_distinct_key y sql de esa medida.

Solución rápida

Consulta los requisitos de estos parámetros en nuestra sum_distinctpágina de documentación.

Hacer referencia a campos de diferentes vistas con fanouts

Es posible que tu consulta use una medida de la vista A, pero que la medida haga referencia a un campo de la vista B. En esta situación, Looker usará la clave principal de la vista A para calcular esa medida. Si tu consulta implica una distribución, puede que no sea la clave principal correcta. Para familiarizarte con las difusiones, consulta esta publicación de la comunidad relacionada.

Solución rápida

Para solucionar este problema, añada la clave principal de la vista B a la métrica problemática con el parámetro sql_distinct_key.

¿Qué ocurre si no se aplica ninguna de las causas indicadas, pero el error sigue produciéndose?

Hay una situación muy concreta en la que tu clave principal puede ser única y las otras causas de este problema no se aplican a tu consulta, pero el error sigue produciéndose. En primer lugar, tu consulta implicará varias combinaciones de relationship: one_to_many. En segundo lugar, una de las métricas de la consulta hará referencia a una dimensión que combina valores de varias vistas combinadas.

Para solucionar este problema, anota esa medida y sigue estos pasos:

  1. Busque la dimensión de la medida que combina valores de varias vistas unidas.
  2. Busca las vistas a las que hace referencia esa dimensión.
  3. Concatena las claves principales de esas vistas con la función de concatenación de tu dialecto SQL.
  4. Coloca esa clave concatenada en un parámetro sql_distinct_key de la medida que ha provocado el problema.