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 (la più comune)
- Uso non corretto di
sql_distinct_key
- Eseguire il riferimento a un campo in più visualizzazioni quando sono coinvolti i fanout
Chiave primaria non univoca
La causa più comune di questo errore è che la query coinvolge una chiave primaria non univoca. Specifica una chiave primaria utilizzando primary_key: yes
in una dimensione, che deve essere una dimensione senza valori ripetuti.
Correzione 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 chiave primaria 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 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 query è di tipo sum_distinct
, potrebbe esserci una mancata corrispondenza dell'unicità tra i parametri sql_distinct_key
e sql
della 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 la misura. Se la query prevede un fanout, la chiave primaria potrebbe non essere quella corretta da utilizzare. Per saperne di più sui fanout, consulta il nostro post della scheda Community correlato.
Correzione rapida
Per risolvere il problema, aggiungi la chiave primaria della vista B alla misura del problema con il parametro sql_distinct_key
.
Cosa succede se nessuna delle cause elencate si applica, ma l'errore si verifica comunque?
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:
- Trova la dimensione all'interno della misura che combina i valori di più visualizzazioni unite.
- Trova le visualizzazioni a cui fa riferimento la dimensione.
- Concatena le chiavi principali da queste visualizzazioni 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.