代码之家  ›  专栏  ›  技术社区  ›  d_-

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

  •  0
  • d_-  · 技术社区  · 7 年前

    我想创建两个 BigQuery Firebase报告,反映了以下方面最近12周的数据:

    1. 每周触发事件的不同用户

    这些报告的灵感来自一个 Tableau-report 我在网上看到:

    enter image description here

    1.事件计数。名称 .

    我的第一次迭代:

    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;
    

    # 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;
    

    注意:通配符表不支持视图。查询返回一个错误 如果通配符表与数据集中的任何视图匹配。目前, 针对多个表的查询不支持缓存结果 已选中)。如果多次运行同一个通配符查询,则 为每个查询计费。通配符表支持本机BigQuery存储 查看( source

    总结如下:

    • 如果我不必每周手动输入日期字段,但脚本“知道”当前日期,那么速度会快得多 week's index number 我们正在更新最近12周的数据。

    附录

    • 第32周2017年8月7日2017年8月13日20170807 20170813
    • 2017年8月14日第33周2017年8月20日20170814 20170820
    • 第34周2017年8月21日2017年8月27日20170821 20170827
    • 2017年8月28日第35周2017年9月3日20170828 20170903
    • 第36周2017年9月4日2017年9月10日20170904 20170910
    • 2017年9月11日第37周2017年9月17日20170911 20170917
    • 2017年9月18日第38周2017年9月24日20170918 20170924
    • 第40周2017年10月2日2017年10月8日20171002 20171008
    1 回复  |  直到 4 年前
        1
  •  4
  •   Mikhail Berlyant    7 年前

    如果我不必每周手动输入日期字段,速度会快得多),但脚本“知道”我们所在的周数,并根据我们所在的周更新最近12周的数据。

    下面是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       
    

    更新:

    我在上面发布了我想要的第一个迭代答案

    #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