错误:非唯一值/主键(或 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 中的主键来计算该测量值。如果您的查询涉及扇出,这可能不是要使用的正确主键。(如需熟悉扇出,请参阅我们的相关社区帖子。)

快速修复

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

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

在某种非常特殊的情况下,主键可以是唯一的,并且此问题的其他原因不适用于您的查询,但此错误仍会发生。首先,您的查询将涉及 relationship: one_to_many 的多个联接。其次,查询中的某个测量值会引用一个维度,该维度将多个联接视图的值组合在一起。

如需解决此问题,请记下该测量值,然后按以下步骤操作:

  1. 在衡量值中找到用于组合来自多个联接视图的值的维度。
  2. 查找该维度引用的视图。
  3. 使用 SQL 方言的串联函数串联这些视图的主键。
  4. 将该串联键放入导致问题的测量结果的 sql_distinct_key 参数中。