在分区表上使用FIRST或LAST会返回不一致的值

时间:2016-07-24 05:20:16

标签: google-bigquery

在运行多个表的查询中使用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聚合,这对我们来说是一个大问题。谢谢!

1 个答案:

答案 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确实有效,因为他们不关心订单