以下查询是默认值(在此示例中为INTEGER(21))与计算值混合的示例(在此示例中为COUNT(*))。
SELECT
dimension,
SUM(metric)
FROM (
SELECT
"dim1" AS dimension,
INTEGER(21) AS metric),
(
SELECT
dimension,
COUNT(*) AS metric
FROM (
SELECT
"dim2" AS dimension,
INTEGER(42) AS metric)
GROUP BY
dimension)
GROUP BY
dimension
运行此查询时,它会被拒绝,并显示以下错误消息:
不能联合表:不兼容的类型。 '度量' :TYPE_INT64' metric' :TYPE_UINT64
换句话说,count操作返回无符号整数,而手动创建的整数则被签名。我理解count操作的底层逻辑,它显然总是返回一个大于或等于0的整数。同样可以通过在第11行用INTEGER构造函数封装COUNT(*)来避免这种情况。我的示例查询。
我想我的真正问题是:为什么COUNT(*)返回一个无符号整数而不是一个有符号整数(这样可以在其他类似SQL的环境中实现更简洁的查询)?
答案 0 :(得分:3)
使COUNT返回无符号整数类型只是一个不幸的错误,特别是因为BigQuery甚至不支持其元数据中的无符号整数。但是这个(以及许多其他问题)是通过BigQuery中的标准SQL支持修复的,它可以作为Alpha使用。有关如何启用它的详细信息 - 请检查https://cloud.google.com/bigquery/sql-reference/enabling-standard-sql
答案 1 :(得分:0)
使用unsigned int有利的原因有几个:
答案 2 :(得分:0)
如果您正在计算,则不可能有负数。因此,通过使其成为无符号整数,可以扩展可处理的数字范围。