本页将帮助您排查以下 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
参数中。