Sql 选择筛选特定条件的最佳可能方式

Sql 选择筛选特定条件的最佳可能方式,sql,sql-server,Sql,Sql Server,请参考以下场景。数据库存储用户执行的两种操作,需要评估哪些用户在未与系统交互的情况下注销 操作1->用户登录 操作2->用户按下按钮 用户登录数据库后,会存储已登录状态和用户ID,如果用户按下按钮,也会记录该操作 前 数据库 状态------用户ID LoggedIn--------------------123 按钮按------------123 LoggedIn--------------------456 LoggedIn---------789 按键------------789 按键

请参考以下场景。数据库存储用户执行的两种操作,需要评估哪些用户在未与系统交互的情况下注销

操作1->用户登录

操作2->用户按下按钮

用户登录数据库后,会存储已登录状态和用户ID,如果用户按下按钮,也会记录该操作

数据库 状态------用户ID

LoggedIn--------------------123

按钮按------------123

LoggedIn--------------------456

LoggedIn---------789

按键------------789

按键------------789

LoggedIn--------------------111

LoggedIn--------------------456

LoggedIn--------------------123

按钮按下
操作可能会发生多次,但必须在登录到系统后按下按钮。用户ID 111仅登录到系统,但未执行按键操作。用户ID 123作为最后一条记录再次登录到系统。但未找到
按钮按
事件

如何筛选出所有未按
按钮操作的用户。
用户ID 123111和456应作为未执行按键操作的ID返回


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

您可以使用
不存在

select t.*
from table t
where not exists (select 1 
                  from table t1 
                  where t1.userid = t.userid and t1.status = 'ButtonPress'
                 );
编辑:如果数据的格式与您提供的格式相同,则可以使用
分组依据

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;

您可以使用
不存在

select t.*
from table t
where not exists (select 1 
                  from table t1 
                  where t1.userid = t.userid and t1.status = 'ButtonPress'
                 );
编辑:如果数据的格式与您提供的格式相同,则可以使用
分组依据

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;
您可以尝试以下方法:

select user_id from 
tablename 
where status!='ButtonPress' and 
id in (select max(id) from tablename GROUP BY user_id) ;
在这里,我们在子查询中查找每个用户的最新活动状态,然后在外部查询中筛选具有“loggedin”状态的用户。

您可以尝试以下操作:

select user_id from 
tablename 
where status!='ButtonPress' and 
id in (select max(id) from tablename GROUP BY user_id) ;

在这里,我们在子查询中查找每个用户的最新活动状态,然后在外部查询中筛选具有“loggedin”状态的用户。

您将如何
排序这些行?@VamsiPrabhala没有特定的顺序。用户id 456还应带有123和111,对吗?@VikasSaini是的。对不起,这是我的错mistake@HarshaW表中是否有id字段?您将如何排序这些行?@VamsiPrabhala没有特定的顺序。用户id 456还应附带123和111,对吗?@VikasSaini是的。对不起,这是我的错mistake@HarshaW表中有id字段吗?谢谢。修改了问题。请看一看。在这种情况下,答案是错误的。LoggedIn---------------123按钮按----------123按钮按----------123按钮按----------123按钮按----------123按钮按----------456 LoggedIn----------789按钮按----------789按钮按----------789 LoggedIn----------111 LoggedIn----------456 LoggedIn----------123谢谢你。修改了问题。请看一看。在这种情况下,答案是错误的。LoggedIn---------------123按钮按----------123按钮按----------123按钮按----------123按钮按----------123 LoggedIn----------456 LoggedIn----------789按钮按----------789 LoggedIn----------111 LoggedIn----------456 LoggedIn----------123