我正在尝试比较字符串“ 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等行的数量。此外,还有一列日期,因此输入状态将是按顺序排列的。
答案 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'
。
如果您只需要了解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
。