如何查询以日期命名的表范围

Posted

技术标签:

【中文标题】如何查询以日期命名的表范围【英文标题】:how do I query a range of table that's named after date 【发布时间】:2017-07-19 23:02:37 【问题描述】:

我想从一系列表中查询数据。但是表名是以创建表的日期命名的,例如:2017-01-102017-01-11 等。经过一番研究,我发现TABLE_DATE_RANGE 功能可能适合我的需要,但是表名必须格式为<prefix><date> 例如:

SELECT * 
FROM TABLE_DATE_RANGE([mydataset.sea_weather_],
                TIMESTAMP("2016-05-01"),
                TIMESTAMP("2016-05-09"))

问题再次是我要查询的表不带前缀,但我仍然想从表/日期范围内进行查询。请指教。

【问题讨论】:

您没有使用 mysql。我最好的猜测是 BigQuery,所以我适当地标记了。 数据库是mysql,谢谢。 哎呀,抱歉 - 我以为你说你正在使用 mysql :o) 所以你期待 BigQuery 的答案吗? 【参考方案1】:

在做了一些研究后,我发现 TABLE_DATE_RANGE 功能可能适合我的需要,但是表名必须采用<prefix><date> 的格式

我认为你的发现不正确

尝试在下面查询比方说上周的表格(假设表格名称是 YYYMMDD 格式 - 所以没有前缀):

对于 BigQuery 旧版 SQL

#legacySQL
SELECT <list of fields ...>
FROM (TABLE_DATE_RANGE([yourProject:yourDataset.], 
        DATE_ADD(CURRENT_TIMESTAMP(), -7 - DAYOFWEEK(CURRENT_TIMESTAMP()) + 2, 'DAY'), 
        DATE_ADD(CURRENT_TIMESTAMP(), -1 - DAYOFWEEK(CURRENT_TIMESTAMP()) + 2, 'DAY')
      ))
GROUP BY 1, 2, 3
ORDER BY 1, 2, 3 

您可以使用 [githubarchive:day] 公共数据集对其进行测试

#legacySQL
SELECT 
  STRFTIME_UTC_USEC(created_at, "%Y%m%d") AS d,
  DAYOFWEEK(created_at) AS dow,
  DAYOFWEEK(CURRENT_TIMESTAMP()) AS cdow,
  COUNT(1) AS rows
FROM (TABLE_DATE_RANGE([githubarchive:day.], 
        DATE_ADD(CURRENT_TIMESTAMP(), -7 - DAYOFWEEK(CURRENT_TIMESTAMP()) + 2, 'DAY'), 
        DATE_ADD(CURRENT_TIMESTAMP(), -1 - DAYOFWEEK(CURRENT_TIMESTAMP()) + 2, 'DAY')
      ))
GROUP BY 1, 2, 3
ORDER BY 1, 2, 3

对于 BigQuery 标准 SQL

#standardSQL
SELECT 
  DATE(created_at) AS d,
  EXTRACT(DAYOFWEEK FROM DATE(created_at)) AS dow,
  EXTRACT(DAYOFWEEK FROM CURRENT_DATE()) AS cdow,
  COUNT(1) AS c
FROM `yourProject.yourDataset.*`
WHERE _TABLE_SUFFIX
  BETWEEN FORMAT_DATE('%Y%m%d',DATE_ADD(CURRENT_DATE(), INTERVAL -7 - EXTRACT(DAYOFWEEK FROM CURRENT_DATE()) + 2 DAY))
  AND FORMAT_DATE('%Y%m%d',DATE_ADD(CURRENT_DATE(), INTERVAL -1 - EXTRACT(DAYOFWEEK FROM CURRENT_DATE()) + 2 DAY))
GROUP BY 1, 2, 3
ORDER BY 1, 2, 3  

请注意,在标准 SQL 中,如果您的数据集中有视图,则此类模式可能会出现问题 - 您将收到类似 Error: Views cannot be queried through prefix 的错误 在这种情况下 - 例如,您可以使用下面的“技巧”(假设视图与 (2*) 通配符不匹配

#standardSQL
SELECT 
  DATE(created_at) AS d,
  EXTRACT(DAYOFWEEK FROM DATE(created_at)) AS dow,
  EXTRACT(DAYOFWEEK FROM CURRENT_DATE()) AS cdow,
  COUNT(1) AS c
FROM `githubarchive.day.2*`
WHERE CONCAT('2', _TABLE_SUFFIX ) 
  BETWEEN FORMAT_DATE('%Y%m%d',DATE_ADD(CURRENT_DATE(), INTERVAL -7 - EXTRACT(DAYOFWEEK FROM CURRENT_DATE()) + 2 DAY))
  AND FORMAT_DATE('%Y%m%d',DATE_ADD(CURRENT_DATE(), INTERVAL -1 - EXTRACT(DAYOFWEEK FROM CURRENT_DATE()) + 2 DAY))
GROUP BY 1, 2, 3
ORDER BY 1, 2, 3

【讨论】:

以上是关于如何查询以日期命名的表范围的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式重命名 Access 查询中的表

如何处理以保留 Sql 关键字命名的表列?

Bigquery如何查询多个相同结构的表?

如何将 MySQL JOOQ 重命名表查询范围限定为同一个数据库?

Hibernate 命名查询的表名问题

python如何创建日期命名文件?