【发布时间】:2020-11-19 07:49:36
【问题描述】:
我有一个由电子邮件、日期 (TIMESTAMP)、id 和多个其他列组成的表。
对于每个电子邮件条目,我想计算前 3 天内与该电子邮件关联的唯一 ID 的数量。
+-------------------+-------------------------+------------+----+
| email | day | other cols | id |
+-------------------+-------------------------+------------+----+
| user1@gmail.com | 2020-06-21 16:31:00 UTC | ... | 0 |
| user1@gmail.com | 2020-06-22 14:54:00 UTC | ... | 1 |
| user1@gmail.com | 2020-06-23 08:23:00 UTC | ... | 0 |
| user1@gmail.com | 2020-06-24 13:51:00 UTC | ... | 0 |
| user1@gmail.com | 2020-06-25 09:54:00 UTC | ... | 2 |
| user1@gmail.com | 2020-06-25 12:25:00 UTC | ... | 0 |
| user1@gmail.com | 2020-06-26 15:21:00 UTC | ... | 2 |
| user2@hotmail.com | 2020-06-21 12:23:00 UTC | ... | 0 |
| user2@hotmail.com | 2020-06-21 16:54:00 UTC | ... | 0 |
| user2@hotmail.com | 2020-06-22 08:23:00 UTC | ... | 0 |
| user2@hotmail.com | 2020-06-22 12:13:00 UTC | ... | 1 |
| user2@hotmail.com | 2020-06-24 09:32:00 UTC | ... | 1 |
| user2@hotmail.com | 2020-06-25 05:45:00 UTC | ... | 1 |
| user2@hotmail.com | 2020-06-26 12:32:00 UTC | ... | 2 |
| user2@hotmail.com | 2020-06-27 19:53:00 UTC | ... | 1 |
+-------------------+-------------------------+------------+----+
附加列应如下所示:
+-------------------+-------------------------+------------+----+-----------------------------+
| email | day | other cols | id | distinct ids in last 3 days |
+-------------------+-------------------------+------------+----+-----------------------------+
| user1@gmail.com | 2020-06-21 16:31:00 UTC | ... | 0 | 1 |
| user1@gmail.com | 2020-06-22 14:54:00 UTC | ... | 1 | 2 |
| user1@gmail.com | 2020-06-23 08:23:00 UTC | ... | 0 | 2 |
| user1@gmail.com | 2020-06-24 13:51:00 UTC | ... | 0 | 2 |
| user1@gmail.com | 2020-06-25 09:54:00 UTC | ... | 2 | 3 |<- 3, because ids 0, 1 and 2 have been seen in previous 3 days
| user1@gmail.com | 2020-06-25 12:25:00 UTC | ... | 0 | 3 |
| user1@gmail.com | 2020-06-26 15:21:00 UTC | ... | 2 | 2 |
| user2@hotmail.com | 2020-06-21 12:23:00 UTC | ... | 0 | 1 |
| user2@hotmail.com | 2020-06-21 16:54:00 UTC | ... | 0 | 1 |
| user2@hotmail.com | 2020-06-22 08:23:00 UTC | ... | 0 | 1 |
| user2@hotmail.com | 2020-06-22 12:13:00 UTC | ... | 1 | 2 |
| user2@hotmail.com | 2020-06-24 09:32:00 UTC | ... | 1 | 2 |
| user2@hotmail.com | 2020-06-25 05:45:00 UTC | ... | 1 | 2 |
| user2@hotmail.com | 2020-06-26 12:32:00 UTC | ... | 1 | 1 |
| user2@hotmail.com | 2020-06-27 19:53:00 UTC | ... | 1 | 1 |
+-------------------+-------------------------+------------+----+-----------------------------+
我曾尝试使用窗口函数按电子邮件进行分区并计算前 3 天的不同 id。
COUNT(DISTINCT id) OVER (PARTITION BY email ORDER BY UNIX_DATE(PARSE_DATE('%Y-%m-%d', day))*24*3600 RANGE BETWEEN 3*24*3600 PRECEDING AND CURRENT ROW)
但是这是不允许的:
Window ORDER BY is not allowed if DISTINCT is specified
堆栈溢出有解决方案,如this。但是我不确定它是否需要在计算唯一 ID 之前通过电子邮件进行分区。
我将不胜感激任何关于此的指示。如果它更容易,我也愿意接受使用 DATE 而不是 TIMESTAMP 的解决方案。
【问题讨论】:
标签: sql database count google-bigquery window-functions