在运行多个表的查询中使用LAST或FIRST时,返回的结果不一致。再次执行相同的查询将每次返回不同的结果。
返回的值确实匹配查询中表的一个的正确LAST和FIRST值。但是,在每种情况下使用的表似乎是随机选择的。
例如,下面的查询:
SELECT
FIRST(timestamp) as first_ts,
FROM TABLE_DATE_RANGE([some_table]_, timestamp('2016-07-21'), timestamp('2016-07-22'))
将返回:
first_ts
2016-07-22 07:35:30 UTC
第一次运行,并且:
first_ts
2016-07-21 23:16:26 UTC
下一次运行。等等。
预期结果为2016-07-21 23:16:26
。但是,值2016-07-22 07:35:30 UTC
是表[some_table]_20160722
的第一个时间戳,所以我认为它发生的是BigQuery不允许您在查询表时对表进行排序。结果,FIRST和LAST变得不可靠,因为表的顺序是未知的。请注意,MAX和MIN 做可以在表格中很好地工作。
这不仅适用于使用旧版SQL,而且还使用新SQL以及函数FIRST_VALUE和LAST_VALUE(因为不再支持FIRST和LAST。可能相关吗?)请参阅下面的示例使用新SQL。 / p>
SELECT
FIRST_VALUE(timestamp) OVER (ORDER BY event_sequence ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) first_ts,
FROM `some_table_*`
WHERE _TABLE_SUFFIX BETWEEN '20160721' AND '20160722'
此外(这可能被视为一个单独的问题)在查询单个表时会观察到类似的行为,其中数据已多次附加到 。 FIRST和LAST的结果变得不一致。加载的每个数据子集都表现为分区。
在我看来,这似乎是一个错误,除非有人知道如何做到这一点。 Google Bigquery团队,我们热爱您的产品。但是你可以解决这个问题吗?我们不能以可靠的方式使用FIRST和LAST聚合,这对我们来说是一个大问题。谢谢!
答案 0 :(得分:1)
我们无法以可靠的方式使用FIRST和LAST聚合,而且这样做 对我们来说很重要
我不认为这里有错误!
来自文档:
FIRST( EXPR )
返回函数范围内的第一个连续值。
表格本身不被视为 有序 序列。除非提供一些提示,否则BigQuery不保证输出行的顺序 - 例如ORDER BY
所以在你的例子中 - 你应该在下面使用。这将以可靠的方式为您提供预期的结果!
SELECT
FIRST(timestamp) AS first_ts
FROM (
SELECT *
FROM TABLE_DATE_RANGE([some_table]_, TIMESTAMP('2016-07-21'), TIMESTAMP('2016-07-22'))
ORDER BY timestamp
)
注意:当然MAX和MIN确实有效,因为他们不关心订单