Error: Nilai non-unik/kunci utama (atau sql_distinct_key), kelebihan nilai, atau tabrakan 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 tidak unik

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

Perbaikan cepat

Setelah mengidentifikasi dimensi kunci utama dalam kueri, Anda dapat mengujinya untuk 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 jumlahnya tidak cocok, kunci utama tidak unik dan akan muncul di beberapa baris. Anda harus memilih atau membuat dimensi baru sebagai kunci utama. Jika tidak ada dimensi tunggal yang berisi nilai yang sepenuhnya unik, Anda mungkin perlu menyambungkan kolom untuk membuat dimensi kunci utama Anda sendiri.

Menggunakan row_number guna 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 yang 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 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 untuk 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 merujuk ke kolom dari tampilan B. Dalam situasi ini, Looker akan menggunakan kunci utama dari tampilan A untuk menghitung ukuran tersebut. Jika kueri Anda melibatkan fanout, itu mungkin bukan {i>primary key<i} yang benar untuk digunakan. (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 satu pun penyebab yang tercantum yang berlaku, tetapi error masih terjadi?

Ada situasi yang sangat spesifik di mana kunci utama Anda bisa unik, dan penyebab lain dari masalah ini tidak berlaku untuk kueri Anda namun kesalahan ini masih terjadi. Pertama, kueri Anda akan melibatkan beberapa gabungan relationship: one_to_many. Kedua, salah satu ukuran dalam kueri akan merujuk ke dimensi yang menggabungkan nilai dari beberapa tampilan yang digabungkan.

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

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