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

时间:2017-07-19 23:02:38

标签: mysql sql database google-bigquery

我想查询一系列表格中的数据。但是表名是在创建表的日期之后命名的,例如: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"))

问题再次是我想要查询的表没有带前缀,但我仍然希望从一系列表/日期中进行查询。请指教。

1 个答案:

答案 0 :(得分:0)

  

经过一些研究后我发现TABLE_DATE_RANGE功能可能符合我的需要,但表格名称必须采用<prefix><date>

的格式

我认为你的发现不正确

请尝试使用以下内容查询上周表格(假设表格名称为YYYMMDD格式 - 因此没有前缀):

  

for BigQuery Legacy 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 Standard 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的错误。 在这种情况下 - 您可以使用以下&#34;技巧&#34;例如(假设视图与那个(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