错误:计算总和时存在非唯一值/主键(或 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() window 函数创建唯一字段。然后,此字段可用作主键:

  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 中的主键来计算该测量值。如果您的查询涉及扇出,则可能不是要使用的正确主键。(要熟悉扇出功能,请查看我们的相关社区帖子。)

快速修复

如需解决此问题,请使用 sql_distinct_key 参数将视图 B 中的主键添加到问题测量中。

如果上述原因都不适用,但错误仍然存在,该怎么办?

在非常具体的情况下,主键可能是唯一的,导致此问题的其他原因不适用于您的查询,但此错误仍然存在。首先,您的查询将涉及 relationship: one_to_many 的多个联接。其次,查询中的某个测量会引用将多个联接视图中的值组合在一起的维度。

要解决此问题,请记下该度量方式,然后按以下步骤操作:

  1. 找到合并了多个联接数据视图的值的测量维度。
  2. 查找该维度引用的视图。
  3. 使用 SQL 方言的串联函数串联这些视图中的主键。
  4. 将该串联的键放入导致问题的测量上的 sql_distinct_key 参数中。