Error: Nilai/kunci primer (atau sql_distinct_key) tidak unik, kelebihan atau ketidakcocokan nilai saat menghitung jumlah

Halaman ini akan membantu Anda memecahkan masalah error Looker ini:

  Non-unique value/primary key (or sql_distinct_key), value overflow or collision when computing sum

Salah satu dari beberapa masalah dapat menyebabkan error ini:

Kunci utama non-unik

Penyebab paling umum error ini adalah kueri Anda melibatkan kunci utama yang tidak unik. Anda menentukan kunci utama menggunakan primary_key: yes pada dimensi, dan dimensi tersebut harus berupa dimensi tanpa nilai berulang.

Perbaikan cepat

Setelah mengidentifikasi dimensi kunci utama dalam kueri, Anda dapat menguji keunikannya di SQL Runner Looker dengan kueri ini:

SELECT
  COUNT(*),
  COUNT(DISTINCT your_primary_key)
FROM
  your_table_name

Jika jumlah dalam kueri ini cocok, kunci utama bersifat unik. Jika jumlah tidak cocok, kunci utama tidak unik dan muncul di beberapa baris. Anda harus memilih atau membuat dimensi baru sebagai kunci utama. Jika tidak ada satu dimensi pun yang berisi nilai yang sepenuhnya unik, Anda mungkin perlu menggabungkan kolom untuk membuat dimensi kunci utama Anda sendiri.

Menggunakan row_number untuk membuat kunci utama untuk tabel turunan

Jika menerima error ini dengan tabel turunan, Anda dapat menggunakan fungsi jendela row_number() di database Postgres dan Redshift untuk membuat kolom unik. Kolom ini kemudian dapat digunakan sebagai kunci utama:

  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 ;;
    }
  }
  

Di MySQL, Anda dapat menggunakan variabel yang melakukan iterasi pada setiap baris untuk mencapai efek yang sama:

  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 ;;
    }
  }
  

Penggunaan sql_distinct_key yang salah

Jika salah satu ukuran dalam kueri Anda berjenis sum_distinct, mungkin ada ketidakcocokan keunikan antara parameter sql_distinct_key dan sql dari ukuran tersebut.

Perbaikan cepat

Lihat halaman dokumentasi sum_distinct kami untuk mengetahui persyaratan parameter ini.

Mereferensikan kolom di seluruh tampilan dengan fanout

Kueri Anda mungkin menggunakan ukuran dari tampilan A, tetapi ukuran tersebut mereferensikan kolom dari tampilan B. Dalam situasi ini, Looker akan menggunakan kunci utama dari tampilan A untuk menghitung ukuran tersebut. Jika kueri Anda melibatkan fanout, kunci utama yang digunakan mungkin salah. (Untuk memahami fanout, lihat Postingan komunitas terkait.)

Perbaikan cepat

Untuk mengatasi masalah ini, tambahkan kunci utama dari tampilan B ke pengukuran masalah dengan parameter sql_distinct_key.

Bagaimana jika tidak ada penyebab yang tercantum yang berlaku, tetapi error masih terjadi?

Ada situasi yang sangat spesifik ketika kunci utama Anda dapat bersifat unik, dan penyebab lain dari masalah ini tidak berlaku untuk kueri Anda, tetapi error ini masih terjadi. Pertama, kueri Anda akan melibatkan beberapa join relationship: one_to_many. Kedua, salah satu ukuran dalam kueri Anda akan mereferensikan dimensi yang menggabungkan nilai dari beberapa tampilan gabungan.

Untuk memperbaiki masalah ini, catat ukuran tersebut, lalu ikuti langkah-langkah berikut:

  1. Temukan dimensi dalam pengukuran yang menggabungkan nilai dari beberapa tampilan yang digabungkan.
  2. Temukan tampilan yang dirujuk oleh dimensi tersebut.
  3. Gabungkan kunci utama dari tampilan tersebut menggunakan fungsi penyambungan dialek SQL Anda.
  4. Tempatkan kunci yang digabungkan tersebut ke dalam parameter sql_distinct_key pada pengukuran yang menyebabkan masalah.