请参考以下情形。该数据库存储用户执行的2种操作,并且需要评估哪个用户在不与系统交互的情况下注销。
Action1->用户登录
Action2->用户按下按钮
一旦用户登录数据库,就会存储“已记录”状态和用户ID,并且如果用户按下按钮,它也会记录该操作。
例如。
数据库 状态-------用户ID
LoggedIn ----------------- 123
ButtonPress ------------ 123
LoggedIn ----------------- 456
LoggedIn ----------------- 789
ButtonPress ------------ 789
ButtonPress ------------ 789
LoggedIn ----------------- 111
LoggedIn ----------------- 456
LoggedIn ----------------- 123
ButtonPress
动作可以发生多次,但是登录到系统后必须按下按钮。用户ID 111仅登录到系统,但ButtonPress操作未完成。用户ID 123作为最后一条记录再次登录到系统。但是没有发现ButtonPress
个事件。
如何过滤掉所有未通过ButtonPress
操作的用户。
用户ID 123,111和456应该返回未通过ButtonPress操作的ID。
解决此问题的最佳方法是什么?
答案 0 :(得分:1)
您可以使用not exists
:
select t.*
from table t
where not exists (select 1
from table t1
where t1.userid = t.userid and t1.status = 'ButtonPress'
);
编辑::如果数据的格式与您提供的格式相同,则可以使用GROUP BY
:
select t.*
from (select userid, sum(case when status = 'LoggedIn' then 1 else 0 end) LoggedIn_c,
sum(case when status = 'ButtonPress' then 1 else 0 end) ButtonPress_c
from table t
group by userid
) t
where LoggedIn_c >= ButtonPress_c;
答案 1 :(得分:1)
您可以尝试以下方法:
select user_id from
tablename
where status!='ButtonPress' and
id in (select max(id) from tablename GROUP BY user_id) ;
在这里,我们正在子查询中查找每个用户的最新活动状态,然后过滤在外部查询中具有“已登录”状态的用户。