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