Errore: valore non univoco/chiave primaria (o sql_distinct_key), overflow del valore o collisione durante il calcolo della somma

Questa pagina ti aiuterà a risolvere questo errore di Looker:

  Non-unique value/primary key (or sql_distinct_key), value overflow or collision when computing sum

Questo errore può essere causato da uno dei seguenti problemi:

Chiave primaria non univoca

La causa più comune di questo errore è che la query riguarda una chiave primaria non univoca. Per specificare una chiave primaria, utilizzi primary_key: yes su una dimensione, che deve essere una dimensione senza valori ripetuti.

Soluzione rapida

Dopo aver identificato le dimensioni chiave primaria nella query, puoi testarle in modo univoco in SQL Runner di Looker con questa query:

SELECT
  COUNT(*),
  COUNT(DISTINCT your_primary_key)
FROM
  your_table_name

Se i conteggi in questa query corrispondono, la chiave primaria è univoca. Se i conteggi non corrispondono, la chiave primaria non è univoca e viene visualizzata in più righe. Dovrai scegliere o creare una nuova dimensione come chiave primaria. Se nessuna dimensione contiene valori completamente univoci, potrebbe essere necessario concatenare i campi per creare una dimensione di chiave primaria.

Utilizzo di row_number per generare una chiave primaria per una tabella derivata

Se ricevi questo errore con una tabella derivata, puoi utilizzare la funzione finestra row_number() nei database Postgres e Redshift per creare un campo univoco. Questo campo può quindi essere utilizzato come chiave 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 ;;
    }
  }
  

In MySQL, puoi utilizzare una variabile che esegue l'iterazione di ogni riga per ottenere lo stesso effetto:

  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 ;;
    }
  }
  

Utilizzo non corretto di sql_distinct_key

Se una delle misure nella tua query è del tipo sum_distinct, potrebbe esserci una mancata corrispondenza di univocità tra i parametri sql_distinct_key e sql della misura in questione.

Soluzione rapida

Consulta la pagina della documentazione di sum_distinct per i requisiti di questi parametri.

Fare riferimento ai campi nelle viste con i fanout

La tua query può utilizzare una misura della vista A, ma la misura fa riferimento a un campo della vista B. In questa situazione, Looker utilizzerà la chiave primaria della vista A per calcolare questa misura. Se la query prevede un fanout, potrebbe non essere la chiave primaria corretta da utilizzare. Per acquisire familiarità con i fanout, dai un'occhiata al post della scheda Community correlato.

Soluzione rapida

Per risolvere questo problema, aggiungi la chiave primaria dalla vista B alla misura del problema con il parametro sql_distinct_key.

Che cosa succede se non si è verificata nessuna delle cause elencate, ma l'errore persiste?

Esiste una situazione molto specifica in cui la chiave primaria può essere univoca e le altre cause di questo problema non si applicano alla query, ma questo errore si verifica ancora. Innanzitutto, la query coinvolgerà più join di relationship: one_to_many. In secondo luogo, una delle misure della query farà riferimento a una dimensione che combina valori di più viste unite.

Per risolvere il problema, prendi nota della misura, quindi segui questi passaggi:

  1. Individua la dimensione all'interno della misura che combina i valori di più viste unite.
  2. Trova le viste a cui fa riferimento la dimensione.
  3. Concatena le chiavi primarie da quelle viste utilizzando la funzione di concatenazione del tuo dialetto SQL.
  4. Inserisci la chiave concatenata in un parametro sql_distinct_key nella misura che ha causato il problema.