エラー: 一意でない値/主キー(または 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 パラメータに配置します。