本页面可帮助您排查此 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_key
和 sql
参数之间可能存在唯一性不匹配。
快速修复
如需了解这些参数的要求,请参阅我们的 sum_distinct
文档页面。
使用扇出跨视图引用字段
您的查询可能使用视图 A 中的测量,但此测量引用的是视图 B 中的字段。在这种情况下,Looker 将使用视图 A 中的主键来计算该测量值。如果您的查询涉及扇出,则可能不是要使用的正确主键。(要熟悉扇出功能,请查看我们的相关社区帖子。)
快速修复
如需解决此问题,请使用 sql_distinct_key
参数将视图 B 中的主键添加到问题测量中。
如果上述原因都不适用,但错误仍然存在,该怎么办?
在非常具体的情况下,主键可能是唯一的,导致此问题的其他原因不适用于您的查询,但此错误仍然存在。首先,您的查询将涉及 relationship: one_to_many
的多个联接。其次,查询中的某个测量会引用将多个联接视图中的值组合在一起的维度。
要解决此问题,请记下该度量方式,然后按以下步骤操作:
- 找到合并了多个联接数据视图的值的测量维度。
- 查找该维度引用的视图。
- 使用 SQL 方言的串联函数串联这些视图中的主键。
- 将该串联的键放入导致问题的测量上的
sql_distinct_key
参数中。