JOIN中的BigQuery子选择不识别字段

时间:2013-06-11 21:42:19

标签: google-bigquery

我有一个表格,每个用户都有多个过时的快照,还有一个表格,其中包含每个用户的最新快照日期(通过查询生成)。

我已经尝试了很多变化来让两者的简单连接起作用,但我没有运气。我想从快照表中选择与另一个表中的用户ID和日期匹配的所有记录。

我有各种各样的错误,但这是最新的(子选择和重命名是为了调试哪个字段可能导致问题):

SELECT t1.uuid, t1.username, t1.d 
  FROM (SELECT uuid, username, date AS d FROM [Activity.user_snapshots]) as t1
  JOIN EACH (SELECT uuid, date AS dg FROM [Activity.latest_snapshots]) as t2
  ON t1.uuid = t2.uuid AND t1.d = t2.dg;

在这种情况下我得到的错误响应是:

Error: Field 'dg' not found in table '__S0'.

当我尝试更直接的查询时:

SELECT t1.uuid, t1.username, t1.date
  FROM [Activity.user_snapshots] as t1
  JOIN EACH [Activity.latest_snapshots] as t2
  ON t1.uuid = t2.uuid AND t1.date = t2.date;

我收到此错误:

Error: Field date from table __S0 is not a leaf field.

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

时间戳值上有一个错误。如果你强迫他们达到他们潜在的微秒值,你应该是好的。此查询应该有效:

SELECT t1.uuid, t1.username, USEC_TO_TIMESTAMP(t1.d)
  FROM (
    SELECT uuid, username, TIMESTAMP_TO_USEC(date) AS d 
    FROM [Activity.user_snapshots]) as t1
  JOIN EACH (
    SELECT uuid, TIMESTAMP_TO_USEC(date) AS dg 
    FROM [Activity.latest_snapshots]) as t2
  ON t1.uuid = t2.uuid AND t1.d = t2.dg;

答案 1 :(得分:0)

如果它对其他人有帮助。我遇到的问题是,当我创建latest_snapshots表时,因为我必须将STRING日期​​字段转换为时间戳以对其执行MAX运算符,所以它作为时间戳对象保存到结果表中。

因此错误消息具有误导性。令人讨厌的是,我不得不创建一个新表,我将时间戳转换回字符串对象,因为在JOIN-ON子句中无法做到这一点。

如果有人知道怎么做这一切都是一个没有创建额外表格的查询,那就太酷了。到目前为止,我尝试使用子选择失败了。

请注意,时间戳问题上的联接已在先前版本中修复;如果您继续发现问题,请告诉我们。