我有一个表,其中包含如下示例数据:
InquiryId status
-------------------
inquiry1 New
inquiry1 Started
inquiry1 Done
inquiry2 New
inquiry2 Pending
inquiry3 New
inquiry3 Started
inquiry4 New
inquiry4 Cancelled
等等
每个查询都以"新"状态开始,并且可以通过中间状态("已开始"、"待定"(到达任何一个结束状态("完成"、"已取消"..(
问题是如何找到以New开头但从未达到结束状态的查询列表,即需要编写什么SQL查询才能获得未完成查询的列表。
p.S:使用Sybase数据库
您可以使用以下查询:
select distinct InquiryId
from <table_name>
where status not in('Done','Cancelled');
它将返回所有不具有Done
或Cancelled
状态且仍处于中间状态的InquiryId
。
您可以使用not exists
:
select t.*
from table t
where status = 'New' and
not exists (select 1
from table t1
where t1.InquiryId = t.InquiryId and
t1.status in ('Done', 'Cancelled')
);
我会使用聚合:
select inquiryId
from t
group by inquiryId
having sum(case when status = 'New' then 1 else 0 end) > 0 and
sum(case when status in ('Done', 'Cancelled') then 1 else 0 end) = 0;
having
子句中的条件计算满足给定条件的每个inquiryId
的行数。> 0
表示inquiryId
具有至少一行。= 0
表示inquiryId
具有多于一行。