【发布时间】:2018-05-01 15:44:08
【问题描述】:
我正在尝试计算用户是否在三个时间范围内访问过网站:
- 过去 30 天
- 31 到 60 天之间
- 61 到 90 天之间
我正在使用 Netezza,它不支持 SELECT 子句中的相关子查询。有关必须重写以不使用相关子查询的成功查询,请参阅 Rextester:http://rextester.com/JGR62033
样本数据:
| user_id | last_visit | num_days_since_2017117 |
|---------|------------|------------------------|
| 1234 | 2017-11-02 | 15.6 |
| 1234 | 2017-09-30 | 48.6 |
| 1234 | 2017-09-03 | 75.0 |
| 1234 | 2017-08-21 | 88.0 |
| 9876 | 2017-10-03 | 45.0 |
| 9876 | 2017-07-20 | 120.0 |
| 5545 | 2017-09-15 | 63.0 |
所需的输出:
| user_id | last_30 | btwn_31_60 | btwn_61_90 |
|---------|---------|------------|------------|
| 1234 | 1 | 1 | 1 |
| 5545 | 0 | 0 | 1 |
| 9876 | 0 | 1 | 0 |
【问题讨论】:
-
如果 DBMS 支持 CASE 或类似的东西,这里不需要相关子查询。
-
为什么投反对票? @a_horse_with_no_name?如果我可以在问题中提供额外的清晰度,请发表评论。我觉得我很清楚并提供了足够的信息来回答这个问题,不是吗?
-
我没有投反对票。我评论了。
-
@KenWhite 您能否举例说明使用示例数据会是什么样子?
-
我不确切知道 DBMS 支持什么,但您可以使用
SELECT user_id, SUM(CASE WHEN num_days <= 30 then 1 else 0 end) as last_30, SUM(CASE WHEN numdays > 30 AND numdays <=60 then 1 else 0 end) as btwn_31_60,等在 user_id 上带有 GROUP BY 的东西。
标签: sql database-performance netezza correlated-subquery