我有一张表格,其中包含以下示例数据:
InquiryId status
-------------------
inquiry1 New
inquiry1 Started
inquiry1 Done
inquiry2 New
inquiry2 Pending
inquiry3 New
inquiry3 Started
inquiry4 New
inquiry4 Cancelled
..依此类推
每个查询都以“新”状态开始,并且可以通过中间状态(“开始”,“待处理”)到达任一结束状态(“完成”,“已取消”。)
问题是如何找到以New开头但从未达到结束状态的查询列表,即需要编写哪些SQL查询才能获取未完成的查询列表。
PS:使用Sybase数据库
答案 0 :(得分:1)
您可以使用以下查询:
select distinct InquiryId
from <table_name>
where status not in('Done','Cancelled');
它将返回所有状态为InquiryId
或Done
且仍处于中间状态的所有Cancelled
。
答案 1 :(得分:1)
您可以使用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')
);
答案 2 :(得分:0)
我将使用聚合:
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
有多行。