为什么GROUP BY的BigQuery COUNT(*)不正确?

问题描述 投票:1回答:1

我有一个带有唯一整数IDAuditUpdated时间戳的表。我正在尝试按ID范围将其分为记录组,如下所示:

SELECT CAST(ID / 100000 AS INT64) AS `Start`,
       COUNT(*) AS `RowCount`,
       MAX(AuditUpdated) AS `LastMod`
FROM `dataset.mytable`
GROUP BY `Start`
ORDER BY `Start`

显示正常工作,前3条记录显示以下信息:

0, 25526, 2016-03-29 15:32:11.473 UTC
1, 65892, 2017-11-22 20:05:38.800 UTC
2, 48550, 2017-12-23 01:03:25.030 UTC

但是,这里的COUNT(*)是错误的。例如,我可以运行以下命令:

SELECT COUNT(*) FROM `dataset.mytable` WHERE ID < 100000

结果为61989!不仅如此,MAX(AuditUpdated)实际上是2017-03-30 22:47:19.153 UTC

我对Microsoft SQL Server数据库中的同一表运行相同的查询,并且它可以正常工作。我只能假设BigQuery做的事情与众不同,但我无法终生弄清楚如何做!

sql google-bigquery bigquery
1个回答
1
投票

运行此玩具示例:

select 
  cast(x/10 as int64) as bucket,
  min(x) as min_x,
  max(x) as max_x
from unnest(generate_array(1,1000,1)) x
group by 1

SQL Server中,INT/INT执行“整数除法”,它返回结果的整个整数部分,并丢弃余数/小数位(即四舍五入)。运行select 5/3应该返回1而不是1.666667~来说明这一点。

[BigQuery,另一方面,当除以FLOAT64]时返回[C0

如BigQuery INT64/INT64中所述,将StandardSQL Documentation强制转换为FLOAT64“将返回最接近的INT64值”(又名正常舍入)。您的INT64存储桶实际上会将所有ID从1转移到50000

如果要获得SQL Server类型的结果,请考虑将代码编辑为149999

© www.soinside.com 2019 - 2024. All rights reserved.