【问题标题】:Count unique ids in a rolling time frame计算滚动时间范围内的唯一 ID
【发布时间】:2018-05-19 10:11:05
【问题描述】:

我有一个简单的表格,如下所示,上面有很多 ID 和日期。

ID      Date
10R46   2014-11-23  
10R46   2016-04-11  
100R9   2016-12-21
10R91   2013-05-03 
...     ...

我想制定一个查询来计算日期滚动时间范围内的唯一 ID,例如十天。这意味着对于每个日期,它应该给我该日期和 10 天前之间唯一 ID 的数量。结果应该是这样的。

UniqueTenDays    Date
200              2014-11-23 
324              2014-11-24 
522              2014-11-25
532              2014-11-26 
...              ...

类似于下面的内容,但我意识到我需要应用 WHERE 子句并以某种方式计算每个 Date 的 ID。

SELECT Date, COUNT(DISTINCT ID)
FROM T 
WHERE Date BETWEEN DATE_SUB(Date, INTERVAL 10 DAY) AND Date
GROUP BY Date
ORDER BY Date

提前致谢。

【问题讨论】:

    标签: google-bigquery ansi-sql


    【解决方案1】:

    以下是 BigQuery 标准 SQL

    #standardSQL
    WITH temp1 AS (
      SELECT dt, STRING_AGG(DISTINCT id) AS users
      FROM `project.dataset.yourtable`
      GROUP BY dt
    ), temp2 AS (
      SELECT
        dt, 
        STRING_AGG(users) OVER(ORDER BY UNIX_DATE(dt) RANGE BETWEEN 10 PRECEDING AND CURRENT ROW) users
      FROM temp1
    )
    SELECT dt, 
      (SELECT COUNT(DISTINCT id) FROM UNNEST(SPLIT(users)) AS id) UniqueTenDays
    FROM temp2
    

    你可以使用下面的虚拟数据来测试/玩它

    #standardSQL
    WITH `project.dataset.yourtable` AS (
      SELECT '10R46' id,  DATE '2014-11-23' dt UNION ALL  
      SELECT '10R46',     DATE '2016-04-11' UNION ALL  
      SELECT '10R46',     DATE '2016-04-12' UNION ALL  
      SELECT '10R47',     DATE '2016-04-13' UNION ALL  
      SELECT '10R48',     DATE '2016-04-14' UNION ALL  
      SELECT '100R9',     DATE '2016-12-21' UNION ALL
      SELECT '10R91',     DATE '2013-05-03'
    ), temp1 AS (
      SELECT dt, STRING_AGG(DISTINCT id) AS users
      FROM `project.dataset.yourtable`
      GROUP BY dt
    ), temp2 AS (
      SELECT
        dt, 
        STRING_AGG(users) OVER(ORDER BY UNIX_DATE(dt) RANGE BETWEEN 10 PRECEDING AND CURRENT ROW) users
      FROM temp1
    )
    SELECT dt,  
      (SELECT COUNT(DISTINCT id) FROM UNNEST(SPLIT(users)) AS id) UniqueTenDays
    FROM temp2
    

    【讨论】:

    • 非常感谢 Mikhail,这很好用。您确实向我介绍了我过去一个小时一直在阅读的一堆新概念,但这一切都很有意义。
    • 这很好用,但是在 temp2 完成后尝试在更大的数据集上执行此操作时会变得非常慢。有没有办法让最后一个 id 未嵌套的查询更高效?
    • 尝试使用APPROX_COUNT_DISTINCT
    • 哇,游戏规则改变者。谢谢您,感谢您的快速回复!
    猜你喜欢
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    • 2020-12-23
    • 2016-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-13
    相关资源
    最近更新 更多