Errore: valore/chiave primaria non univoco (o sql_distinct_key), overflow di valori 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 coinvolge una chiave primaria non univoca. Devi specificare una chiave primaria utilizzando primary_key: yes in una dimensione, che deve essere una dimensione senza valori ripetuti.

Soluzione rapida

Dopo aver identificato le dimensioni della chiave primaria nella query, puoi verificarne l'unicità 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 singola dimensione contiene valori completamente univoci, potrebbe essere necessario concatenare i campi per creare una dimensione chiave principale.

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 itera su 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 è di tipo sum_distinct, potrebbe esserci una mancata corrispondenza di univocità tra i parametri sql_distinct_key e sql di questa misura.

Correzione rapida

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

Fare riferimento ai campi in più visualizzazioni con i fanout

La query potrebbe utilizzare una misura della visualizzazione A, ma la misura fa riferimento a un campo della visualizzazione B. In questo caso, Looker utilizzerà la chiave primaria della vista A per calcolare questa misura. Se la query prevede un fanout, la chiave primaria potrebbe non essere quella corretta da utilizzare. Per acquisire familiarità con i fanout, consulta il post della scheda Community correlato.

Soluzione rapida

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

Che cosa succede se nessuna delle cause elencate è applicabile, ma l'errore si verifica ancora?

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 si verifica comunque questo errore. Innanzitutto, la query prevede più join di relationship: one_to_many. In secondo luogo, una delle misure nella query farà riferimento a una dimensione che combina i valori di più visualizzazioni unite.

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

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