我在 BigQuery 上有每日表格。如何查询"newest"个?

I have daily tables on BigQuery. How to query the "newest" one?

我创建每日表格。如何查询"newest"一个?

例如,GitHubArchive 现在发布每日表格 - 而不是单一表格(参见 /r/bigquery/.../github_archive_changes_monthly_and_daily_tables/)。

要查找最新的 table,您可以使用 BigQuery 的 table 查询函数:

比如最新的每日GitHubArchivetable:

SELECT COUNT(*) num_records
FROM TABLE_QUERY(githubarchive:day,
  "table_id IN (
     SELECT table_id FROM githubarchive:day.__TABLES__ 
     ORDER BY creation_time DESC LIMIT 1)")

# 201859

为了最大限度地方便起见,您可以将该查询存储为视图以与他人共享。然后查询最新的table,只查询视图:

SELECT num_records
FROM [fh-bigquery:public_dump.githubarchive_latest_day]

# 201859

有关 table 查询函数的更多信息,请参阅 Jordan 对 How do I use the TABLE_QUERY() function in BigQuery? 的回答。

Felipe 的回答使用旧版 SQL。这是标准 SQL.

中的解决方案

如果你的 table 名字有谓语table 后缀,就像你 link 中的 GitHub 的例子(每个名字都使用 YYYYMMDD 后缀天),您可以使用 wildcard tables and TABLE_SUFFIX:

SELECT COUNT(*)
FROM `githubarchive.day.events_*`
WHERE _TABLE_SUFFIX = (
  SELECT MAX(SUBSTR(table_id, -8))
  FROM `githubarchive.day.__TABLES_SUMMARY__`
  WHERE REGEXP_CONTAINS(table_id, "events_\d{8}")
)

如果您想依赖 BigQuery 的有关创建时间的元数据而不是前缀,您可以这样做:

SELECT COUNT(*)
FROM `githubarchive.day.*`
WHERE _TABLE_SUFFIX = (
  SELECT table_id
  FROM `githubarchive.day.__TABLES_SUMMARY__`
  ORDER BY creation_time DESC
  LIMIT 1
)

请注意,如果您的项目中有 table 具有不同的架构,后一种语法是危险的,因为查询将使用它在通配符中看到的第一个 table 的架构。

如果您尝试创建按日期分区的 table,可以使用名为 date-partitioned tables 的 BigQuery 功能来完成此操作,并使之后的查询更容易。