仅对于不同的条件求和(仅适用于..)

时间:2018-01-31 23:22:00

标签: sql amazon-redshift

我有以下查询:

select user_id, min(case when event='login' then date_trunc('day',time) end) first_login, 
max(case when event='login' then date_trunc('day',time) end) last_login, 
sum(case when event='login' then 1 end) sum_logins, 
sum(case when event='login' and date_trunc('day',time) between current_date and current_date-30 then 1 end) sum_logins_last_30 
from table
group by user_id

这里的问题是,即使每天多次登录,总和也在计算。我想要获得的是仅限唯一天数的总登录次数(时间是一个时间戳,一天内可以进行多次登录),并且仅为特殊日期追踪30天登录次数。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

您可以使用count(distinct ..并计算不同日期的数量。

count(distinct case when event='login' and date_trunc('day',time) 
               between current_date-30  and current_date
               then date_trunc('day',time) end) sum_logins_last_30 

答案 1 :(得分:1)

在Redshift中,您可能想要尝试两个级别的聚合:

select user_id,
       min(day_time) as first_login, 
       max(day_time) as last_login,
       sum(cnt) as num_logins, 
       sum(case when day_time between current_date - 30 and current_date then 1 else 0 end) sum_logins_last_30 
from (select user_id, date_trunc(day, time) as day_time, count(*) as cnt
      from table
      where event = 'login'
      group by user_id, date_trunc(day, time)
     ) t
group by user_id;

这有时比count(distinct)更好。

另请注意其他更改:

  • 这会过滤event = 'login'子句中的where。因此,此版本不会返回没有登录的用户。
  • between关心第二和第三个操作数的顺序。 "较小"一个应该是第一个。