我想在 SQL Server 中查找标记为已完成但未经历已解决状态的记录。
下面是以下示例。
tracking_id task_id task status old_status new_status_id
1195372 140717 ABC Complete NULL NULL
1195373 140717 ABC Complete NULL New
1195374 140717 ABC Complete New Completed
1195380 140718 XYZ Complete NULL NULL
1195381 140718 XYZ Complete NULL New
1195382 140718 XYZ Complete New Completed
1195383 140719 PQR Complete NULL NULL
1195384 140719 PQR Complete NULL Resolved
1195385 140719 PQR Complete Resolved Completed
现在在表中为 task_id 140717 并且140718标记为">已完成">,但它从未进入状态"已解决"。其中task_id 140719也被标记为已完成,但它的状态为已解决。所以我想编写SQL查询来获取task_id 140717和140718的记录。
有关如何为此编写查询的任何帮助将不胜感激。
这个想法是为了确保任务 ID 具有"已完成"记录,但没有"已解决"记录。
select ...
from the_table t_outer
where
status = 'Completed' and
not exists (
select 1 from the_table t_inner
where
t_inner.task_id = t_outer.task_id and -- same task
'Resolved' in (t_inner.old_status, t_inner.new_status)
)
(整个状态/new_status/old_status感觉不整洁。
像这样使用NOT EXISTS
:
select *
from yourtable t
where status = 'Complete'
and not exists
(select top 1 1
from yourtable o
where o.task_id = t.task_id
and o.old_status = 'Resolved')
如果old_status_id
并不总是'resolved'
'completed'
则使用not exists()
:
select *
from t
where new_status_id = 'completed'
and not exists (
select 1
from t as i
where i.task_id = t.task_id
and i.new_status_id = 'resolved'
)
你只需要task_id
而不是行?
SELECT task_id
FROM yourTable
GROUP BY task_id
HAVING COUNT(CASE WHEN old_status = 'Resolved' THEN 1 END) = 0
AND COUNT(CASE WHEN new_status_id = 'Completed' THEN 1 END) = 1
现在,如果您希望所有记录都涉及那些"未完成"的任务
WITH cte as (
SELECT task_id
FROM yourTable
GROUP BY task_id
HAVING COUNT(CASE WHEN old_status = 'Resolved' THEN 1 END) = 0
AND COUNT(CASE WHEN new_status_id = 'Completed' THEN 1 END) = 1
)
SELECT *
FROM yourTable Y
JOIN cte C
ON Y.task_id = C.task_id
select * from mytable
where new_status_id = 'Completed'
and old_status <> 'Resolved'
您应该遵循一些有关 select 语句的指南,因为这是非常基本的语法。
只需使用一些 where 子句:
SELECT *
FROM Table
WHERE old_status !+ 'Resolved'
AND new_status_id = 'Completed'