Sql 我计划您是使用子查询还是JOIN,因为这个问题的上下文是“最有效的”,重要的是要注意,原始“rextester”示例中建议的相关子查询可能比这个基于案例的解决方案慢得多。任何“selfjoin”都可能导致基表被多次扫描,而case构造/单表扫描完全抛出查询
Sql 我计划您是使用子查询还是JOIN,因为这个问题的上下文是“最有效的”,重要的是要注意,原始“rextester”示例中建议的相关子查询可能比这个基于案例的解决方案慢得多。任何“selfjoin”都可能导致基表被多次扫描,而case构造/单表扫描完全抛出查询,sql,database-performance,netezza,correlated-subquery,Sql,Database Performance,Netezza,Correlated Subquery,我计划您是使用子查询还是JOIN,因为这个问题的上下文是“最有效的”,重要的是要注意,原始“rextester”示例中建议的相关子查询可能比这个基于案例的解决方案慢得多。任何“selfjoin”都可能导致基表被多次扫描,而case构造/单表扫描完全抛出查询计划的可能性极低:)@Lars,我一定误解了相关子查询的效率,以及何时使用它们。这是一条正确的语句:最好使用CASE语句有条件地检查单个表中是否存在条件,但是,有条件地检查单独表中是否存在条件最好使用相关子查询执行?@psrpsrpsr 1。)
我计划您是使用子查询还是
JOIN
,因为这个问题的上下文是“最有效的”,重要的是要注意,原始“rextester”示例中建议的相关子查询可能比这个基于案例的解决方案慢得多。任何“selfjoin”都可能导致基表被多次扫描,而case构造/单表扫描完全抛出查询计划的可能性极低:)@Lars,我一定误解了相关子查询的效率,以及何时使用它们。这是一条正确的语句:最好使用CASE语句有条件地检查单个表中是否存在条件,但是,有条件地检查单独表中是否存在条件最好使用相关子查询执行?@psrpsrpsr 1。)检查条件是否存在通常比其他子查询更快且更可取2。)select中任何类型的子查询都会增加逐行扫描子查询表的风险3。)JOIN
s通常是优先于选择子查询,因为您可以避免#2 4。)无论您使用子查询还是连接
| 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 |
SELECT
user_id,
SUM(CASE WHEN num_days <= 30 then 1 else 0 end) as last_30,
SUM(CASE WHEN num_days > 30 AND numdays < 61 then 1 else 0 end) as btwn_31_60,
SUM(CASE WHEN num_days >= 61 then 1 else 0 end) as btwn_61_90
FROM
YourTableName -- You didn't provide a tablename
GROUP BY
user_id
select
user_id
,MAX(case when '2017-11-17'-visit_date <=30
then 1
else 0
end) as last_30
,MAX(case when '2017-11-17'-visit_date >=31
and '2017-11-17'-visit_date <=60
then 1
else 0
end) as between_31_60
,MAX(case when '2017-11-17'-visit_date >=61
and '2017-11-17'-visit_date <=90
then 1
else 0
end) as between_61_90
from
visits
group by user_id
order by user_id