Auf dieser Seite können Sie diesen Looker-Fehler beheben:
Non-unique value/primary key (or sql_distinct_key), value overflow or collision when computing sum
Dieser Fehler kann eines der folgenden Probleme verursachen:
- Ein nicht eindeutiger Primärschlüssel (am häufigsten verwendet)
- Falsche Verwendung von
sql_distinct_key
- Bei Fanouts in verschiedenen Ansichten auf ein Feld verweisen
Nicht eindeutiger Primärschlüssel
Die häufigste Ursache für diesen Fehler ist, dass Ihre Abfrage einen nicht eindeutigen Primärschlüssel enthält. Sie geben einen Primärschlüssel mithilfe von primary_key: yes
für eine Dimension an. Dabei muss es sich um eine Dimension ohne wiederholte Werte handeln.
Schnelle Fehlerbehebung
Nachdem Sie die Primärschlüsseldimensionen in Ihrer Abfrage identifiziert haben, können Sie sie mit der folgenden Abfrage auf Eindeutigkeit im SQL Runner von Looker testen:
SELECT COUNT(*), COUNT(DISTINCT your_primary_key) FROM your_table_name
Wenn die Anzahlen in dieser Abfrage übereinstimmen, ist der Primärschlüssel eindeutig. Wenn die Anzahlen nicht übereinstimmen, ist der Primärschlüssel nicht eindeutig und wird in mehreren Zeilen angezeigt. Sie müssen eine neue Dimension als Primärschlüssel auswählen oder erstellen. Wenn keine einzelne Dimension eindeutige Werte enthält, müssen Sie möglicherweise die Felder verketten, um eine eigene Primärschlüsseldimension zu erstellen.
Mit row_number
einen Primärschlüssel für eine abgeleitete Tabelle generieren
Wenn Sie diesen Fehler bei einer abgeleiteten Tabelle erhalten, können Sie die Fensterfunktion row_number()
in Postgres- und Redshift-Datenbanken verwenden, um ein eindeutiges Feld zu erstellen. Dieses Feld kann dann als Primärschlüssel verwendet werden:
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 können Sie eine Variable verwenden, die jede Zeile iteriert, um den gleichen Effekt zu erzielen:
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 ;; } }
Falsche Verwendung von sql_distinct_key
Wenn einer der Messwerte in Ihrer Abfrage den Typ sum_distinct
hat, stimmt die Eindeutigkeit der Parameter sql_distinct_key
und sql
möglicherweise nicht überein.
Schnelle Fehlerbehebung
Informationen zu den Anforderungen dieser Parameter finden Sie auf der Dokumentationsseite von sum_distinct
.
Felder mit Fanouts in verschiedenen Ansichten referenzieren
In der Abfrage wird möglicherweise ein Messwert aus Ansicht A verwendet, aber der Messwert verweist auf ein Feld aus Ansicht B. In diesem Fall verwendet Looker den Primärschlüssel aus Ansicht A, um diesen Messwert zu berechnen. Wenn Ihre Abfrage ein Fanout umfasst, ist dies möglicherweise nicht der richtige Primärschlüssel. Weitere Informationen zu Fanouts findest du in unserem zugehörigen Communitybeitrag.
Schnelle Fehlerbehebung
Zur Behebung dieses Problems fügen Sie dem Problemmesswert den Primärschlüssel aus Ansicht B mit dem Parameter sql_distinct_key
hinzu.
Was passiert, wenn keiner der aufgeführten Ursachen zutrifft, der Fehler aber weiterhin auftritt?
Es gibt eine sehr spezielle Situation, in der Ihr Primärschlüssel eindeutig sein kann, und die anderen Ursachen dieses Problems treffen nicht auf Ihre Abfrage zu, der Fehler tritt jedoch weiterhin auf. Zunächst umfasst Ihre Abfrage mehrere Joins von relationship: one_to_many
. Zweitens verweist einer der Messwerte in Ihrer Abfrage auf eine Dimension, die Werte aus mehreren verknüpften Datenansichten kombiniert.
Um dieses Problem zu beheben, notieren Sie sich diese Messung und gehen Sie dann so vor:
- Suchen Sie die Dimension innerhalb des Messwerts, in der Werte aus mehreren verknüpften Datenansichten kombiniert werden.
- Suchen Sie die Ansichten, auf die diese Dimension verweist.
- Verketten Sie die Primärschlüssel aus diesen Ansichten mithilfe der Verkettungsfunktion Ihres SQL-Dialekts.
- Fügen Sie diesen verketteten Schlüssel in einen
sql_distinct_key
-Parameter für den Messwert ein, der das Problem verursacht hat.