在MySQL中检索下一行

时间:2019-07-18 15:26:01

标签: mysql sql

我正在尝试比较字符串“ reject”是否在字符串“ approve”之前。例如,

+----+----------+
| cid| Status   |
+----+----------+
| 1  | pending  |
| 1  | reject   |
| 1  | pending  |
| 1  | approve  |
| 2  | pending  |
| 2  | reject   |
| 2  | approve  |
| 3  | pending  |
| 3  | approve  |
| 3  | reject   |
| 4  | approve  |
| 4  | pending  |
| 4  | approve  |
+----+----------+

然后从上表中,我想返回id 2,因为字符串批准直接在字符串拒绝之后出现。到目前为止,我的想法是创建另一个包含下一行值的列。因此,在执行sql查询之后,它将类似于以下内容:(请注意,不包含ID 3,因为即使在字符串拒绝之后出现了一个字符串批准,但它也不来自同一个ID)。

+----+----------+------------+
| cid| Status   | Next Value |
+----+----------+------------+
| 1  | pending  | reject     |
| 1  | reject   | pending    |
| 1  | pending  | approve    |
| 1  | approve  | pending    |
| 2  | pending  | reject     |
| 2  | reject   | approve    |
| 2  | approve  | pending    |
| 3  | pending  | approve    |
| 3  | approve  | reject     |
| 3  | reject   | approve    |
| 4  | approve  | pending    |
| 4  | pending  | approve    |
| 4  | approve  | (null)     |
+----+----------+------------+

基于上述想法,我仍然不确定如何编写查询,并且在构建查询时需要帮助。我尝试搜索,但是大多数答案都在使用滞后函数的SQL Server中。另外,将不胜感激任何其他方法。 (注意:这里有一个ID列,代表第1,2,...,12等行的数量。此外,还有一列日期,因此输入状态将是按顺序排列的。

2 个答案:

答案 0 :(得分:1)

如果您的服务器不支持LAG()之类的窗口功能,则可以使用以下方法:

select r.id, r.cid
from mytable r
join mytable a
  on  a.cid = r.cid
  and a.id = (
    select min(id)
    from mytable a2
    where a2.cid = r.cid
      and a2.id  > r.id
  )
where r.Status = 'reject'
  and a.Status = 'approve'

这将返回带有Status = 'reject'的行,然后直接跟一行 与Status = 'approve'

db-fiddle

如果您只需要了解cid而没有重复,请使用

select distinct r.cid

答案 1 :(得分:0)

您可以使用聚合和having

select cid
from t
where status in ('reject', 'approve')
group by cid
having min(case when status = 'reject' then date end) < max(case when status = 'approve' then date end);

这是将最早的拒绝日期与最近的批准日期进行比较,并返回拒绝之前批准之前的cid