【发布时间】:2018-09-25 21:37:09
【问题描述】:
我正在尝试获取特定日期的唯一事件数,回滚 90/30/7 天。我已经使用下面的查询在有限数量的行上进行了这项工作,但是对于大型数据集,我会从变得庞大的聚合字符串中得到内存错误。
我正在寻找一种更有效的方法来实现相同的结果。
表格看起来像这样:
+---+------------+-------------+
| | date | userid |
+---+------------+-------------+
| 1 | 2013-05-14 | xxxxx |
| 2 | 2017-03-14 | xxxxx |
| 3 | 2018-01-24 | xxxxx |
| 4 | 2013-03-21 | xxxxx |
| 5 | 2014-03-19 | xxxxx |
| 6 | 2015-09-03 | xxxxx |
| 7 | 2014-02-06 | xxxxx |
| 8 | 2014-10-30 | xxxxx |
| ..| ... | ... |
+---+------------+-------------+
所需结果的格式:
+---+------------+---------------------------------------------+
| | date | active_users_7_days | active_users_90_days |
+---+------------+---------------------------------------------+
| 1 | 2013-05-14 | 1240 | 34339 |
| 2 | 2017-03-14 | 4334 | 54343 |
| 3 | 2018-01-24 | ..... | ..... |
| 4 | 2013-03-21 | ..... | ..... |
| 5 | 2014-03-19 | ..... | ..... |
| 6 | 2015-09-03 | ..... | ..... |
| 7 | 2014-02-06 | ..... | ..... |
| 8 | 2014-10-30 | ..... | ..... |
| ..| ... | ..... | ..... |
+---+------------+---------------------------------------------+
我的查询如下所示:
#standardSQL
WITH
T1 AS(
SELECT
date,
STRING_AGG(DISTINCT userid) AS IDs
FROM
`consumer.events`
GROUP BY
date ),
T2 AS(
SELECT
date,
STRING_AGG(IDs) OVER(ORDER BY UNIX_DATE(date) RANGE BETWEEN 90 PRECEDING
AND CURRENT ROW) AS IDs
FROM
T1 )
SELECT
date,
(
SELECT
COUNT(DISTINCT (userid))
FROM
UNNEST(SPLIT(IDs)) AS userid) AS NinetyDays
FROM
T2
【问题讨论】:
-
你为什么想要一个巨大的
STRING_AGG(DISTINCT userid)? -
@FelipeHoffa 我想我需要按日期分组的不同用户 ID。您还有其他更有效的方法来实现结果吗?
-
@Frithiof 我认为 Felipe 的问题是您需要显示实际的 id 还是仅计算一个就足够了?导致内存错误的是字符串的聚合,除非您确实需要查看它们,然后只需返回一个计数。
-
@BenP 是的,字符串的聚合导致了错误。我不需要查看实际的 ID。也许我的速度很慢,但是如何在不聚合它们的情况下计算日期范围内的不同 ID?
标签: sql google-bigquery bigquery-standard-sql