【问题标题】:BigQuery subselect in JOIN does not recognize fieldsJOIN 中的 BigQuery 子选择无法识别字段
【发布时间】:2013-06-11 21:42:18
【问题描述】:

我有一个表,每个用户有多个日期快照,还有一个表,每个用户的快照的最新日期(通过查询生成)。

我尝试了多种变体来简单地将两者结合起来,但我没有运气。我想从快照表中选择与另一个表中的用户 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.

有什么想法吗?

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    加入时间戳值存在错误。如果您将它们强制为它们的基本微秒值,那么您应该很好。此查询应该有效:

    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;
    

    【讨论】:

    • 这个错误修复了吗?我在使用时间戳字段执行 ORDER BY 时遇到问题。
    【解决方案2】:

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

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

    如果有人知道如何完成所有这一切,只需一个查询,而无需创建所有额外的表,那就太好了。到目前为止,我对子选择的尝试都失败了。

    注意加入时间戳问题在之前的版本中已修复;如果您仍然发现问题,请告诉我们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多