为什么count(*)返回无符号整数?

时间:2016-04-27 16:02:43

标签: google-bigquery

以下查询是默认值(在此示例中为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的环境中实现更简洁的查询)?

3 个答案:

答案 0 :(得分:3)

使COUNT返回无符号整数类型只是一个不幸的错误,特别是因为BigQuery甚至不支持其元数据中的无符号整数。但是这个(以及许多其他问题)是通过BigQuery中的标准SQL支持修复的,它可以作为Alpha使用。有关如何启用它的详细信息 - 请检查https://cloud.google.com/bigquery/sql-reference/enabling-standard-sql

答案 1 :(得分:0)

使用unsigned int有利的原因有几个:

  • 哲学:正如您所提到的,COUNT不能返回负数,只能返回natural numbers,这是无符号整数用于表示的内容。它是适合这项工作的合适工具。
  • 范围:unsigned int可以存储大约两倍于signed int的非负值。这大大降低了变量在表示函数输出时溢出的可能性。
  • 类型安全:通过使用无法表示无效数据的类型,它会阻止用户尝试进行无效比较。如果您尝试将COUNT的输出与负数进行比较,分析仪可以立即告诉您,您正在进行的比较没有意义并且可能是错误的,从而可能使您免于恼人的错误。

答案 2 :(得分:0)

如果您正在计算,则不可能有负数。因此,通过使其成为无符号整数,可以扩展可处理的数字范围。