选择最佳的方法来滤除特定条件

时间:2018-08-16 16:05:43

标签: sql sql-server

请参考以下情形。该数据库存储用户执行的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。

解决此问题的最佳方法是什么?

2 个答案:

答案 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) ;

在这里,我们正在子查询中查找每个用户的最新活动状态,然后过滤在外部查询中具有“已登录”状态的用户。