【问题标题】:BigQuery count(*) throws type mismatch errorBigQuery count(*) 引发类型不匹配错误
【发布时间】:2016-03-01 06:03:58
【问题描述】:

在子查询中使用 count(*) 的结果时,BigQuery 可能会返回错误。这是一个例子:

SELECT
  SUM(IF(year%2=0, children, 0))
FROM (
  SELECT year, COUNT(1) AS children
  FROM [publicdata:samples.natality]
  GROUP BY year 
)

它会返回:

错误:函数 IF 中的参数类型不匹配:“children”是类型 uint64, '0' 是 int32 类型。

BigQuery 内部的某个地方 count(1) 和 0 有不同的类型,它会返回错误。

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    上面的例子脱离了实际情况,如果下面对你没有意义,很抱歉 - 但你要求选择:o)

    在这种特殊情况下,您可以使用 NULL。当然如果默认值不是0就不行了

    SELECT  
      SUM(IF(YEAR%2=0, children, NULL))  
    FROM (  
      SELECT YEAR, COUNT(1) AS children  
      FROM [publicdata:samples.natality]  
      GROUP BY YEAR   
    )
    

    另一种重写查询的选项如下:

    SELECT count(1) AS children   
    FROM [publicdata:samples.natality]  
    WHERE year%2=0
    

    【讨论】:

      【解决方案2】:

      请改用 sum(1)!

      总是以硬核方式修复它:

      SELECT
        SUM(IF(year%2=0, INTEGER(children), 0))
      FROM (
        SELECT year, COUNT(*) AS children
        FROM [publicdata:samples.natality]
        GROUP BY year
      )
      

      现在才意识到最好的方法是:

      SELECT
        SUM(IF(year%2=0, children, 0))
      FROM (
        SELECT year, sum(1) AS children
        FROM [publicdata:samples.natality]
        GROUP BY year 
      )
      

      有任何顾虑/更好的选择吗?

      【讨论】:

        【解决方案3】:

        这是 BigQuery 类型强制中的一个错误。尽管有几种解决方法是可能的 - 我们已经修复了 BigQuery 中的潜在问题,并且该修复将在下一个 BigQuery 版本中提供(我将在推出时更新此答案)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-16
          相关资源
          最近更新 更多