本页将帮助您排查以下 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 中的主键来计算该指标。如果您的查询涉及扇出,则该主键可能不是正确的使用主键。(如需熟悉扇出,请参阅我们的相关社区帖子。)
快速修复
如需解决此问题,请使用 sql_distinct_key
参数将视图 B 的主键添加到问题衡量标准。
如果上述所有原因都不适用,但错误仍会发生,该怎么办?
在某种非常特殊的情况下,主键可以是唯一的,并且此问题的其他原因不适用于您的查询,但此错误仍会发生。首先,您的查询将涉及多个 relationship: one_to_many
联接。其次,查询中的一个测量值将引用一个维度,该维度会组合来自多个联接视图的值。
如需解决此问题,请记下该测量值,然后按以下步骤操作:
- 在衡量指标中,找到用于组合来自多个联接视图的值的维度。
- 查找该维度引用的视图。
- 使用 SQL 方言的串联函数串联这些视图中的主键。
- 将该串联键放入导致问题的测量结果的
sql_distinct_key
参数中。