1

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

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

有任何想法吗?

4

2 回答 2

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;
于 2013-06-11T22:48:28.970 回答
0

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

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

如果有人知道如何做所有这一切是一个查询而无需创建所有额外的表,那会很酷。到目前为止,我尝试用子选择来做这件事都失败了。

请注意,加入时间戳问题已在先前版本中修复;如果您继续看到它的问题,请告诉我们。

于 2013-06-11T21:55:19.357 回答