【问题标题】:Using the TABLE_DATE_RANGE function in BigQuery在 BigQuery 中使用 TABLE_DATE_RANGE 函数
【发布时间】:2017-11-30 23:33:16
【问题描述】:

我在很长一段时间内第一次使用 BigQuery,所以我有点生疏了。

我使用的公共数据集可以是found here for Reddit data.

这是一个快照:

我要做的是创建一个查询,提取 2017 年的所有数据。

基本上,我想使用与此等效的 BQ 语法,它是使用标准 SQL 编写的:

fh-bigquery.reddit_posts.2017*

我知道这将涉及使用 TABLE_DATA_RANGE 函数,但我对它的具体措辞感到困惑。

如果我只使用其中一张表,它会如下所示:

SELECT
  FORMAT_UTC_USEC(SEC_TO_TIMESTAMP(created_utc)) AS created_date
FROM
[fh-bigquery:reddit_posts.2017_06]
LIMIT
10

但我显然试图跨越几个月。

【问题讨论】:

  • fh-bigquery.reddit_posts.2017* 有什么问题?使用标准 SQL(不是使用旧版 SQL 的 TABLE_DATE_RANGE)。
  • 因为我想用 BQ 语法来熟悉它。

标签: google-bigquery


【解决方案1】:

以下是 BigQuery 标准 SQL

#standardSQL
SELECT 
  TIMESTAMP_SECONDS(created_utc) AS created_date 
FROM `fh-bigquery.reddit_posts.2017_*`
LIMIT 10

它完成了您对一个表的查询 - 但对于 2017 年的所有表(不确定您在查询中寻找的实际逻辑是什么 - 但为了简单起见,我希望您将其留在问题之外)

注意:您可以在查询中使用_TABLE_SUFFIX 来确定具体表的具体行来自哪个确切的行——例如:

#standardSQL
SELECT 
  _TABLE_SUFFIX AS month, 
  COUNT(1) AS records  
FROM `fh-bigquery.reddit_posts.2017_*`
GROUP BY month
ORDER BY month 

输出如下

month    records     
-----    ---------
01       9,218,513   
02       8,588,120   
03       9,616,340   
04       9,211,051   
05       9,498,553   
06       9,597,725   
07       9,989,122   
08      10,424,133   
09       9,787,604   
10      10,281,718   

如果由于某种原因您仍然绑定到 BigQuery Legacy SQL - 您可以在下面使用

#legacySQL
SELECT
  FORMAT_UTC_USEC(SEC_TO_TIMESTAMP(created_utc)) AS created_date
FROM TABLE_QUERY([fh-bigquery:reddit_posts], "LEFT(table_id, 5) = '2017_'")  
LIMIT 10

但强烈推荐migrate to Standard SQL

【讨论】:

  • 不应该是..2017* 而不是..2017_* 来捕捉边缘情况,例如201708_?
  • 我故意将2017_ 放在我认为201708_201707_ 是其中包含零行的异常值。
  • @MikhailBerlyant 谢谢你,但同样,我正在寻找 BQ 特定的语法。我已经知道标准 SQL。
  • 请再次阅读答案。它提供了两个选项 - 都适用于 BigQuery - 一个适用于标准 SQL,另一个适用于旧版 SQL!这不是你问的吗?
  • "我正在寻找 BQ 特定的语法" 为什么要学习旧的 SQL 语法?它被称为“遗留”,因为它不是首选的 SQL 方言。
猜你喜欢
  • 1970-01-01
  • 2014-05-03
  • 2014-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多