2017-06-01 43 views
1

我需要查询了所有表相同的聚合统计配套一些命名方案:无法识别的列

SELECT 
    SUBSTR(CONCAT('20', _TABLE_SUFFIX), 0, 10) AS date, 
    CASE 
    WHEN ENDS_WITH(_TABLE_SUFFIX, 'mobile') THEN 'mobile' 
    ELSE 'desktop' 
    END AS client, 
    APPROX_QUANTILES(bytesJS,1000)[OFFSET(500)] AS p50 
FROM 
    `httparchive.runs.20*` 
WHERE 
    ENDS_WITH(_TABLE_SUFFIX, '_pages') 
    OR ENDS_WITH(_TABLE_SUFFIX, '_pages_mobile') 
GROUP BY 
    1, 
    2 
ORDER BY 
    1, 
    2 

但是,查询与Error: Unrecognized name: bytesJS at [7:20]

应该有大约150个表失败与查询匹配。以下是其中一个表格的模式:https://bigquery.cloud.google.com/table/httparchive:runs.2017_05_15_pages

bytesJS是一个有效的列名称,但它无法识别。用不同的已知列替换时出现同样的错误。我不确定这是使用表通配符还是什么的直接结果。

我会重写这与遗留SQL,看看是否有效,但我的查询需要选择表元数据。

这是否与通配符不兼容?

+0

另请注意,删除APPROX_QUANTILES行会产生有效结果,所以错误肯定与bytesJS有关。 –

回答

2

这是一个可行的版本:

#standardSQL 
SELECT 
    SUBSTR(CONCAT('20', _TABLE_SUFFIX), 0, 10) AS date, 
    CASE 
    WHEN ENDS_WITH(_TABLE_SUFFIX, 'mobile') THEN 'mobile' 
    ELSE 'desktop' 
    END AS client, 
    APPROX_QUANTILES(bytesJS,1000)[OFFSET(500)] AS p50 
FROM 
    `httparchive.runs.2017_05_15_pages*` 
#WHERE 
    #ENDS_WITH(_TABLE_SUFFIX, '_pages') 
    #OR ENDS_WITH(_TABLE_SUFFIX, '_pages_mobile') 
GROUP BY 
    1, 
    2 
ORDER BY 
    1, 
    2 

发生了什么事:

  • httparchive.runs.20*包括不具备bytesJS列一些表格,因此该列不考虑其他地区查询。
  • 在查询查找(_TABLE_SUFFIX, '_pages') OR (_TABLE_SUFFIX, '_pages_mobile')时,更改查询假定模式为时已晚。

解决方案:

  • FROM prefix*表水珠不会在这里工作,你必须运行表的经典UNION。
+0

啊我明白了。所以这将是将运行数据集分成页面和请求数据集的一个很好的理由。它必须是造成问题的请求表。 –

+0

是的......另一种“方便”的解决方案是将类型作为前缀 –

+0

Felipe,你知道是否有办法使用COALESCE或IFNULL来解决“无法识别的名称”问题? –