1

我有一个代表某种事件的 SQL 表。我试图确定一个特定事件没有被另一个特定事件“跟随”的所有行。在下表中,这将是有人注册但之后没有退出的所有行(露西和乔)。这可以通过 SQL 实现吗?如果可以,如何实现?

|Id|Name      |Event     |
==========================
|01|Fred      |Sign up   |
-------------------------
|02|Joe       |Sign up   |
--------------------------
|03|Lucy      |Sign up   |
--------------------------
|04|Joe       |Do foo    |
--------------------------
|05|Joe       |Sign out  |
--------------------------
|06|Joe       |Sign up   |
--------------------------
|07|Fred      |Sign out  |
--------------------------

非常感谢

4

3 回答 3

3
SELECT x.* 
  FROM events x 
  LEFT 
  JOIN events y 
    ON y.name = x.name 
   AND y.id > x.id 
   AND y.event ='sign out' 
 WHERE x.event = 'sign up' 
   AND y.id IS NULL;

或类似的东西

于 2013-07-24T14:33:39.137 回答
1
select * from 
table as t1 left outer join table as t2
on(t1.name=t2.name and t2.event='sign out')
where
t1.event='sign up' and t2.name is null

除非您定义它,否则没有“跟随”之类的东西,因此您需要提供更多信息。(可能会在 ON 子句中添加“t1.id >t2.id”)

于 2013-07-24T09:56:08.247 回答
1

我想出的最接近的事情是查看谁拥有完整的“登录”“退出”对。

SELECT Id, Name
FROM 
    EVENTS
WHERE
     event = 'Sign up' or event = 'Sign out'
group by
    Name
having Mod(count(*), 2) <> 0
于 2013-07-24T14:44:42.543 回答