我有一个表格,每个用户都有多个过时的快照,还有一个表格,其中包含每个用户的最新快照日期(通过查询生成)。
我已经尝试了很多变化来让两者的简单连接起作用,但我没有运气。我想从快照表中选择与另一个表中的用户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.
有什么想法吗?
答案 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子句中无法做到这一点。
如果有人知道怎么做这一切都是一个没有创建额外表格的查询,那就太酷了。到目前为止,我尝试使用子选择失败了。
请注意,时间戳问题上的联接已在先前版本中修复;如果您继续发现问题,请告诉我们。