エラー: 一意でない値 / 主キー(または 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_key パラメータと sql パラメータに一意性の不一致がある可能性があります。

一時的な解決方法

これらのパラメータの要件については、sum_distinct のドキュメント ページをご覧ください。

ファンアウトを使ってビュー間でフィールドを参照している

クエリではビュー A の測定を使用しているが、その測定はビュー B のフィールドを参照している可能性があります。この場合、Looker はビュー A の主キーを使用してその測定を計算します。クエリにファンアウトが含まれる場合、使用する主キーが適切でない可能性があります(ファンアウトについて詳しくは、関連するコミュニティ投稿をご覧ください。)

一時的な解決方法

この問題を解決するには、ビュー B の主キーを sql_distinct_key パラメータを使用して問題の測定に追加します。

上記のいずれの原因も該当しないにもかかわらず、エラーが発生する場合はどうすればよいですか。

主キーが一意であり、この問題のその他の原因が自分のクエリには当てはまらないが、このエラーが依然として発生する非常に特殊な状況があります。1 つ目は、クエリに relationship: one_to_many の複数の結合が含まれる場合です。2 つ目は、クエリ内の測定の 1 つが、複数の結合ビューの値を結合するディメンションを参照する場合です。

この問題を解決するには、その測定をメモして、次の操作を行います。

  1. 測定内で、複数の結合ビューの値を結合するディメンションを探します。
  2. そのディメンションによって参照されるビューを見つけます。
  3. SQL 言語の連結関数を使用して、これらのビューの主キーを連結します。
  4. 連結されたキーを、問題の原因となった測定の sql_distinct_key パラメータに配置します。