[英]SQL: Inconsistent column values after self-join
我正在使用 BigQuery 来计算向量的成对距离。 每行都有一个权重向量。
这是查询。 第一部分只是生成随机数据。 重要的部分是最后的SELECT
语句,我通过自联接将每个文档与其他文档进行比较。
WITH input_data AS (
SELECT
document_id
FROM UNNEST(["doc1", "doc2"]) AS document_id
),
exploded AS (
SELECT
document_id,
STRUCT(dimension_id, rand() AS weight) AS weight
FROM
input_data CROSS JOIN UNNEST(GENERATE_ARRAY(1, 3)) AS dimension_id
),
rows_with_weights AS (
SELECT
document_id,
ARRAY_AGG(weight) as vector
FROM
exploded
GROUP BY
document_id
),
SELECT
l.document_id as l_doc_id,
r.document_id as r_doc_id,
l.vector as l_vectors,
r.vector as r_vectors
FROM
rows_with_weights AS l
CROSS JOIN rows_with_weights AS r WHERE l.document_id <= r.document_id
你会看到我的每个文件还与其自身进行比较,这里的地方意想不到的事情发生:当文档被与自己相比,值l_vector
是从那些不同r_vector
。 这是上述查询的输出:
这令人费解。 我希望这两个向量对于同一个文档是相同的。 这里发生了什么?
这里发生了什么?
这正如预期的那样!
BigQuery 不会实现 CTE 的结果。 如果在查询中的多个位置引用了 CTE,则对每个引用执行一次 CTE。 这意味着当你做 self join 时,你实际上连接了两个不同权重的表。 于是结果
我建议改用临时表,这样随机性就会实现一次,然后你就会得到预期的结果
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.