如何在状态=低值之后找到状态=实际值?

时间:2018-08-28 06:49:48

标签: mysql

我有一张桌子,上面有如下记录

tableA

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

上面的表格示例。

现在,我需要找到状态=“低”然后状态=“行动”的那些记录/用户。

我的意思是我的输出需要clickid 123和789。

第一个状态值应,然后起作用。因为也有一些记录,例如status =首先行动,然后status =低。例如clickid = 231。但我要状态=低然后状态=行动。例如clickid = 123&789。

注意: clickid 是用户标识

我可以为此使用哪种查询?

3 个答案:

答案 0 :(得分:2)

如果每个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)

Demo here

要确保一条记录为“低”记录,而另一条记录为“行为”,则可以将以下谓词添加到HAVING

  • SUM(status = 'low') = 1
  • SUM(status = 'act') = 1

答案 1 :(得分:1)

尝试加入:

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

答案 2 :(得分:1)

您可以使用自我加入

 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'