2017-07-19 59 views
0

我想查询一系列表中的数据。但表格名称是以表格创建日期命名的,例如:2017-01-10,2017-01-11等。在做了一些研究之后,我发现TABLE_DATE_RANGE功能可能适合我的需要,但是表格名称的格式必须是<prefix><date>例如:如何查询以日期命名的表的范围

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

问题又是,我想从查询表中不携带一个前缀,但我还是想从一系列的表/日期做一个查询。请指教。

+0

您没有使用MySQL。我最好的猜测是BigQuery,所以我恰当地标记了。 –

+0

数据库是mysql,但是谢谢。 – szd116

+1

哎呀,对不起 - 我以为你说你正在使用mysql:o)你是否期待BigQuery的答案? –

回答

0

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

的格式,我认为你的发现是不正确

尝试以下查询假设前一周表(假设表名是YYYMMDD格式的 - 所以没有前缀):

的BigQuery的大号egacy 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:日]公共数据集

#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 
+0

你有没有试过我建议的? –