table_date_range中的BigQuery select语句无法找到模式

时间:2015-11-30 15:23:31

标签: google-bigquery

我在BigQuery中创建了一个摘要表,其中包含每天的摘要数据(例如20151127)。我想做的是查看我拥有的最新摘要数据,并将其作为我要搜索的新数据的起点。例如,如果我的最后一个日期是2015-11-27,我想为它添加一天,然后从2015-11-28直到今天搜索GA数据。

我希望这样做的方法是使用table_date_range函数提供一个select。 例如

-Dlog4j.configurationFile=file:C:\Users\me\log4j.xml

我无法让这个select语句与BigQuery一起使用。有谁知道像这样查询的方法?我尝试这样做是因为我想每天刷新我的汇总表,但是我不希望每次运行脚本时都要重新查询所有数据。

1 个答案:

答案 0 :(得分:1)

您需要一张豪华桌子 - 只有日期的calendar_dates,如下所示

2015-11-24   
2015-11-25   
2015-11-26   
2015-11-27   
2015-11-28   
2015-11-29   
2015-11-30   
2015-12-01   
2015-12-02   
2015-12-03   
2015-12-04  

以下查询执行您所要求的内容

SELECT 
  *
FROM (
  TABLE_QUERY(YourDataset,
    'table_id IN (
        SELECT 
          "ga_sessions_" + REPLACE(DATE(DATE_ADD(TIMESTAMP(DAY), 1, 'DAY')), '-', '')
        FROM temp.calendar_dates AS days
        CROSS JOIN (
          SELECT MAX(session_date) max_date
          FROM YourDataset.daily_pageview_data
        ) max_avail_day
        WHERE DAY BETWEEN max_date AND CURRENT_DATE()    
    )'
  )
)

要创建奢侈表 - calendar_dates - 您可以使用以下脚本:var_start和:var_end设置以反映您的需求。如果由于某种原因你不想要额外的表 - 你可以将下面的代码嵌入到上面的代码中,而不是temp.calendar_dates引用

SELECT DATE(DATE_ADD(TIMESTAMP(:var_start), pos - 1, "DAY")) as day
FROM (
     SELECT ROW_NUMBER() OVER() AS pos, *
     FROM (FLATTEN((
     SELECT SPLIT(RPAD('', 1 + DATEDIFF(TIMESTAMP(:var_end), TIMESTAMP(:var_start)), '.'),'') AS h
     FROM (SELECT NULL)),h
)))