如何自动更新最近 12 周的数据?

How to automatically update data from the 12 most recent weeks?

我想创建两个 动态每周 BigQuery Firebase 报告,反映最近 12 周的数据:

  1. 每周事件发生次数
  2. 每周触发事件发生次数的 DISTINCT 用户

这些报道的灵感来源于Tableau-report我在网上看到的一个:

我正在尝试创建动态时间戳以提取 event.name 和 2.distinct 的 1.count 的值 user_dim.app_info.app_instance_id.

我的第一次迭代:

SELECT  event.name as event_name, 
COUNT(CASE WHEN _TABLE_SUFFIX >= '20170724' AND _TABLE_SUFFIX < '20170731' THEN event.name END) AS W1,  
COUNT(CASE WHEN _TABLE_SUFFIX >= '20170731' AND _TABLE_SUFFIX < '20170807' THEN event.name END) AS W2,  
COUNT(CASE WHEN _TABLE_SUFFIX >= '20170807' AND _TABLE_SUFFIX < '20170814' THEN event.name END) AS W3,  
COUNT(CASE WHEN _TABLE_SUFFIX >= '20170814' AND _TABLE_SUFFIX < '20170821' THEN event.name END) AS W4,  
COUNT(CASE WHEN _TABLE_SUFFIX >= '20170821' AND _TABLE_SUFFIX < '20170828' THEN event.name END) AS W5,  
COUNT(CASE WHEN _TABLE_SUFFIX >= '20170828' AND _TABLE_SUFFIX < '20170904' THEN event.name END) AS W6,  
COUNT(CASE WHEN _TABLE_SUFFIX >= '20170904' AND _TABLE_SUFFIX < '20170911' THEN event.name END) AS W7,  
COUNT(CASE WHEN _TABLE_SUFFIX >= '20170911' AND _TABLE_SUFFIX < '20170918' THEN event.name END) AS W8,  
COUNT(CASE WHEN _TABLE_SUFFIX >= '20170918' AND _TABLE_SUFFIX < '20170925' THEN event.name END) AS W9,  
COUNT(CASE WHEN _TABLE_SUFFIX >= '20170925' AND _TABLE_SUFFIX < '20171002' THEN event.name END) AS W10,  
COUNT(CASE WHEN _TABLE_SUFFIX >= '20171002' AND _TABLE_SUFFIX < '20171009' THEN event.name END) AS W11,  
COUNT(CASE WHEN _TABLE_SUFFIX >= '20171009' AND _TABLE_SUFFIX < '20171016' THEN event.name END) AS W12  
FROM `<<project-id>>.app_events_*`, UNNEST(event_dim) AS event
WHERE  _TABLE_SUFFIX >= '20170724' AND _TABLE_SUFFIX < '20171016'
GROUP BY event_name
ORDER BY event_name DESC;

我还玩过下面的 sudo 代码:

# Enable StandardSQL
SELECT week, event.name as event_name, COUNT(event.name) as event_count
FROM 
(TABLE_DATE_RANGE([firebase-analytics-sample-data:android_dataset.app_events_],DATE_ADD(CURRENT_TIMESTAMP(), -1, 'WEEK'), DATE_ADD(CURRENT_TIMESTAMP(), -1, 'WEEK'))), ....
....
....
(TABLE_DATE_RANGE([firebase-analytics-sample-data:android_dataset.app_events_],DATE_ADD(CURRENT_TIMESTAMP(), -12, 'WEEK'), DATE_ADD(CURRENT_TIMESTAMP(), -12, 'WEEK'))),
UNNEST(event_dim) as event
GROUP BY event_name
ORDER BY week DESC
LIMIT 12;

Note: wildcard table does not support views. The query returns an error if the wildcard table matches any views in the dataset. Currently, cached results are not supported for queries against multiple tables using a wildcard function (even if the Use Cached Results option is checked). If you run the same wildcard query multiple times, you are billed for each query. Wildcard tables support native BigQuery storage only. You cannot use wildcards when querying an external table or a view (source).

总结一下:

  • 如果我不必每周手动输入日期字段会快很多,但是脚本 "knows" 当前 week's index number 我们所在的位置,并更新最近的 12 个周的数据。

附录

  • 第 30 周 2017 年 7 月 24 日 2017 年 7 月 30 日 20170724 20170730
  • 第 31 周 2017 年 7 月 31 日 2017 年 8 月 6 日 20170731 20170806
  • 第 32 周 2017 年 8 月 7 日 2017 年 8 月 13 日 20170807 20170813
  • 第 33 周 2017 年 8 月 14 日 2017 年 8 月 20 日 20170814 20170820
  • 第 34 周 2017 年 8 月 21 日 2017 年 8 月 27 日 20170821 20170827
  • 第 35 周 2017 年 8 月 28 日 2017 年 9 月 3 日 20170828 20170903
  • 第 36 周 2017 年 9 月 4 日 2017 年 9 月 10 日 20170904 20170910
  • 第 37 周 2017 年 9 月 11 日 2017 年 9 月 17 日 20170911 20170917
  • 第 38 周 2017 年 9 月 18 日 2017 年 9 月 24 日 20170918 20170924
  • 第 39 周 2017 年 9 月 25 日 2017 年 10 月 1 日 20170925 20171001
  • 第 40 周 2017 年 10 月 2 日 2017 年 10 月 8 日 20171002 20171008
  • 第 41 周 2017 年 10 月 9 日 2017 年 10 月 15 日 20171009 20171015

It would be a lot faster if i did not have to manually input the date fields every week), but the script "knows" the week-number we are in, and updates the 12 most recent weeks' data given the week we are in.

以下适用于 BigQuery 标准 SQL

WHERE _TABLE_SUFFIX 
  BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 12 * 7 + EXTRACT(DAYOFWEEK FROM CURRENT_DATE()) - 2 DAY)) 
  AND FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL EXTRACT(DAYOFWEEK FROM CURRENT_DATE()) - 1 DAY))

下面仅显示输出

#standardSQL
SELECT 
  FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 2 * 7 + EXTRACT(DAYOFWEEK FROM CURRENT_DATE()) - 2 DAY)) first_day,
  FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL EXTRACT(DAYOFWEEK FROM CURRENT_DATE()) - 1 DAY)) last_day  

-

first_day   last_day     
20171002    20171015       

每当您 运行 以上脚本 - 它会 return 您最近 12 周期间的开始和结束

更新:

I posted my first iteration answer above in what i would want

#standardSQL
SELECT 
  CONCAT(
    FORMAT_DATE('Week %W %d %B %Y, ', first_day),
    FORMAT_DATE('%d %B %Y, ', last_day), 
    FORMAT_DATE('%Y%m%d ', first_day),
    FORMAT_DATE('%Y%m%d', last_day)
  ) wk
FROM (
  SELECT 
    DATE_SUB(CURRENT_DATE(), INTERVAL 1 * 7 + EXTRACT(DAYOFWEEK FROM CURRENT_DATE()) - 2 DAY) first_day,
    DATE_SUB(CURRENT_DATE(), INTERVAL EXTRACT(DAYOFWEEK FROM CURRENT_DATE()) - 1 DAY) last_day 
)

输出

wk   
Week 41 09 October 2017, 15 October 2017, 20171002 20171015