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:
- Una chiave primaria non univoca (più comune)
- Uso non corretto di
sql_distinct_key
- Fare riferimento a un campo attraverso le visualizzazioni quando sono coinvolti fanout
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:
- Individua la dimensione all'interno della misura che combina i valori di più viste unite.
- Trova le viste a cui fa riferimento la dimensione.
- Concatena le chiavi primarie da quelle viste utilizzando la funzione di concatenazione del tuo dialetto SQL.
- Inserisci la chiave concatenata in un parametro
sql_distinct_key
nella misura che ha causato il problema.