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

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

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

  1. subid clickid status datetime
  2. 1 123 low 2018-07-24 20:20:44
  3. 2 123 act 2018-07-24 21:20:44
  4. 3 231 act 2018-07-25 20:20:44
  5. 4 231 low 2018-07-25 21:20:44
  6. 5 789 low 2018-07-26 20:20:44
  7. 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是一个用户标识
我可以使用什么查询?

egmofgnx

egmofgnx1#

尝试加入:

  1. SELECT t1.clickid
  2. FROM tableA AS t1
  3. JOIN tableA AS t2
  4. ON t1.clickid = t2.clickid
  5. AND t1.status = 'act'
  6. AND t2.status = 'low'
  7. AND t2.datetime < t1.datetime
  8. GROUP BY t1.clickid

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

6ju8rftf

6ju8rftf2#

你可以使用自连接

  1. select a.clickid, a.status, b.clickid, b.status
  2. from tableA a
  3. inner join tableA b on a.clickid = b.clickid
  4. and a.datetime < b.datetime
  5. and a.status = 'low'
  6. and b.status ='act'
wlsrxk51

wlsrxk513#

  1. SELECT
  2. *
  3. FROM
  4. (SELECT
  5. *
  6. FROM
  7. tableA
  8. WHERE
  9. status= 'low') a
  10. INNER JOIN
  11. (SELECT
  12. *
  13. FROM
  14. tableA
  15. WHERE
  16. status= 'act') b ON a.clickid = b.clickid where a.datetime < b.datetime;
rggaifut

rggaifut4#

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

  1. SELECT clickid
  2. FROM TableA
  3. GROUP BY clickid
  4. HAVING MIN(CASE WHEN status = 'low' THEN datetime END) <
  5. MIN(CASE WHEN status = 'act' THEN datetime END)

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

相关问题