錯誤:計算總和時,非唯一值/主鍵 (或 sql_distinct_key)、值溢位或衝突

本頁面可協助您排解 Looker 錯誤:

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

以下是可能導致這項錯誤的幾個問題:

非唯一主鍵

這項錯誤最常見的原因是查詢涉及非唯一的主鍵。您可以在維度上使用 primary_key: yes 指定主鍵,且該維度不得有任何重複的值。

快速修正

在查詢中找出主鍵維度後,您可以使用以下查詢,在 Looker 的 SQL Runner 中測試主鍵是否唯一:

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

如果這項查詢中的計數相符,則主索引鍵是不重複的。如果計數不相符,則主鍵並非唯一,且會出現在多個資料列中。您必須選擇或建立新的維度做為主要索引鍵。如果沒有任何單一維度包含完全不重複的值,您可能需要連結欄位,自行建立主鍵維度

使用 row_number 為衍生資料表產生主鍵

如果您在衍生資料表中收到這則錯誤訊息,可以在 Postgres 和 Redshift 資料庫中使用 row_number() 窗口函式建立不重複的欄位。這個欄位即可用做為主鍵:

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

在 MySQL 中,您可以使用可逐一檢查每個資料列的變數,達到相同的效果:

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

sql_distinct_key 使用方式不正確

如果查詢中的任何指標都是 sum_distinct 類型,則該指標的 sql_distinct_keysql 參數之間可能會出現不一致的情況。

快速修正

如要瞭解這些參數的規定,請參閱 sum_distinct 說明文件頁面

在使用扇形展開的多個檢視畫面中參照欄位

您的查詢可能會使用來自檢視畫面 A 的測量指標,但該測量指標會參照檢視畫面 B 的欄位。在這種情況下,Looker 會使用檢視畫面 A 的主鍵來計算該指標。如果查詢涉及分支,則可能不是要使用的正確主鍵。(如要瞭解 fanouts,請參閱相關社群貼文)。

快速修正

如要解決這個問題,請使用 sql_distinct_key 參數,將來自檢視區塊 B 的主索引鍵新增至問題度量資料。

如果上述原因都不符合你的情況,但錯誤仍會發生,該怎麼辦?

在某些特定情況下,主鍵可以是唯一的,而且這類問題的其他原因不適用於查詢,但仍會發生這個錯誤。首先,您的查詢會涉及多個 relationship: one_to_many 彙整作業。第二,查詢中的其中一個指標會參照維度,將多個已彙整的檢視畫面值合併。

如要修正這個問題,請記下該測量標準,然後按照下列步驟操作:

  1. 找出結合多個已彙整檢視圖的值的評估指標中所含的維度。
  2. 找出該維度參照的檢視畫面。
  3. 使用 SQL 方言的連接函式,將這些檢視表的主鍵連接起來。
  4. 將連接的鍵放入導致問題的評估項目的 sql_distinct_key 參數中。