我有以下查询:
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天登录次数。
非常感谢任何帮助!
答案 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
关心第二和第三个操作数的顺序。 "较小"一个应该是第一个。