如果连续发生,如何在查询中只选择一个值

时间:2017-03-27 14:29:56

标签: sql oracle

   SNO       Status
     1      Entering    
     2      Entering
     3      Assigned    
     4      Denied   
     5      Assigned   

以上值是查询输出的一部分。 要求是Status列应该连续返回一个'Entering'(对于Sno 1和2)。 这里的其他行不应该受到影响。对于前者,'已分配' - 因为它不会连续发生。

2 个答案:

答案 0 :(得分:2)

带有一些逻辑检查的

lag()应该做你想做的事情:

with q as (< your query here> )
select sno, status
from (select q.*, lag(status) over (order by sno) as prev_status
      from q
     ) q
where prev_status is null or prev_status <> status;

答案 1 :(得分:2)

假设SNO是连续的,没有间隙,您可以使用EXISTS

SELECT *
FROM MyTable t
WHERE NOT EXISTS (
    SELECT * FROM MyTable x WHERE t.SNO=x.SNO-1 AND t.Status=x.Status
)

WHERE子句中的相关子查询会查看SNO-1,拒绝匹配Status的行。