Cette page vous aidera à résoudre cette erreur Looker :
Non-unique value/primary key (or sql_distinct_key), value overflow or collision when computing sum
Cette erreur peut être due à l'un des problèmes suivants :
- Une clé primaire non unique (la plus courante)
- Utilisation incorrecte de
sql_distinct_key
- Faire référence à un champ dans plusieurs vues en cas de distribution ramifiée
Clé primaire non unique
La cause la plus courante de cette erreur est que votre requête implique une clé primaire non unique. Pour spécifier une clé primaire, utilisez primary_key: yes
sur une dimension, qui doit être une dimension sans valeurs répétées.
Solution rapide
Une fois que vous avez identifié les dimensions de clé primaire dans votre requête, vous pouvez vérifier leur unicité dans l'exécuteur SQL de Looker avec cette requête :
SELECT COUNT(*), COUNT(DISTINCT your_primary_key) FROM your_table_name
Si les totaux de cette requête correspondent, la clé primaire est unique. Si les décomptes ne correspondent pas, la clé primaire n'est pas unique et apparaît sur plusieurs lignes. Vous devez choisir ou créer une dimension comme clé primaire. Si aucune dimension ne contient de valeurs entièrement uniques, vous devrez peut-être concaténer des champs pour créer votre propre dimension de clé primaire.
Utiliser row_number
pour générer une clé primaire pour une table dérivée
Si ce message d'erreur s'affiche avec une table dérivée, vous pouvez utiliser la fonction de fenêtre row_number()
dans les bases de données Postgres et Redshift pour créer un champ unique. Ce champ peut alors servir de clé primaire:
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 ;; } }
Dans MySQL, vous pouvez utiliser une variable qui itère chaque ligne pour obtenir le même effet:
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 ;; } }
Utilisation incorrecte de sql_distinct_key
Si l'une des mesures de votre requête est de type sum_distinct
, il est possible qu'il existe une incohérence d'unicité entre les paramètres sql_distinct_key
et sql
de cette mesure.
Solution rapide
Consultez la page de documentation de sum_distinct
pour en savoir plus sur ces paramètres. exigences.
Référencer des champs dans les vues avec des fanouts
Votre requête peut utiliser une mesure de la vue A, mais cette mesure fait référence à un champ de la vue B. Dans ce cas, Looker utilisera la clé primaire de la vue A pour calculer cette mesure. Si votre requête implique une distribution ramifiée, ce n'est peut-être pas la clé primaire correcte à utiliser. (Pour en savoir plus sur les fanouts, consultez notre post destiné à la communauté.)
Solution rapide
Pour résoudre ce problème, ajoutez la clé primaire de la vue B à la mesure du problème avec le paramètre sql_distinct_key
.
Que se passe-t-il si aucune des causes listées ne s'applique, mais que l'erreur se produit toujours ?
Il existe une situation très spécifique dans laquelle votre clé primaire peut être unique, et les autres causes de ce problème ne s'appliquent pas à votre requête, mais cette erreur se produit quand même. Tout d'abord, votre requête impliquera plusieurs jointures de relationship: one_to_many
. Deuxièmement, l'une des mesures de votre requête fait référence à une dimension qui combine les valeurs de plusieurs vues jointes.
Pour résoudre ce problème, notez cette mesure, puis procédez comme suit :
- Recherchez la dimension dans la mesure qui combine les valeurs de plusieurs vues jointes.
- Recherchez les vues référencées par cette dimension.
- Concaténez les clés primaires de ces vues à l'aide de la fonction de concaténation de votre dialecte SQL.
- Placez cette clé concaténée dans un paramètre
sql_distinct_key
sur la mesure à l'origine du problème.