如何在status=low value之后找到status=act value?

2fjabf4q  于 2021-06-20  发布在  Mysql
关注(0)|答案(4)|浏览(441)

我有一张表,上面有如下的记录

subid clickid status datetime
1     123     low    2018-07-24 20:20:44
2     123     act    2018-07-24 21:20:44
3     231     act    2018-07-25 20:20:44
4     231     low    2018-07-25 21:20:44
5     789     low    2018-07-26 20:20:44
6     789     act    2018-07-26 21:20:44

我的table的例子在上面。
现在我需要找到那些状态为'low',然后状态为'act'的记录/用户。
我的意思是clickid123和789是我需要的输出。
第一个状态值应该是低的,然后是act。因为有些记录也存在,比如status=act first,然后status=low。例如clickid=231。但我想要地位=低然后地位=行动。例如clickid=123&789。
注意:clickid是一个用户标识
我可以使用什么查询?

nmpmafwu

nmpmafwu1#

如果每次最多有两条记录 clickid 然后您可以使用:

SELECT clickid
FROM TableA
GROUP BY clickid
HAVING MIN(CASE WHEN status = 'low' THEN datetime END) <
       MIN(CASE WHEN status = 'act' THEN datetime END)

此处演示
为了确保一个记录是'low',而另一个是'act',您可以将以下 predicate 添加到 HAVING :
SUM(status = 'low') = 1 SUM(status = 'act') = 1

ckx4rj1h

ckx4rj1h2#

你可以使用自连接

select a.clickid, a.status, b.clickid, b.status 
 from tableA a 
 inner join tableA b on a.clickid = b.clickid 
      and a.datetime < b.datetime 
          and a.status = 'low' 
              and b.status ='act'
ct2axkht

ct2axkht3#

尝试加入:

SELECT t1.clickid 
  FROM tableA AS t1
  JOIN tableA AS t2 
    ON t1.clickid = t2.clickid 
   AND t1.status = 'act'
   AND t2.status = 'low' 
   AND t2.datetime < t1.datetime
GROUP BY t1.clickid

这里还有一个演示:http://sqlfiddle.com/#!9/1f861/1/0年

dgtucam1

dgtucam14#

SELECT 

* 

FROM
(SELECT 
    *
FROM
    tableA
WHERE
    status= 'low') a
    INNER JOIN
(SELECT 
    *
FROM
    tableA
WHERE
    status= 'act') b ON a.clickid = b.clickid where a.datetime < b.datetime;

相关问题