我有一张表,其中包含医疗数字和过程的列。有很多行和医疗号码可以重复许多程序;例如:如何从一个表中选择条件跨同一列的多行
Mid_no procedure
--------------------
100. 20
100. 30
200. 30
我想选择具有程序30和不具有程序20在上述例子中所有mid_no
,所期望的结果将是:
Mid_no. Procedure
---------------------
200. 30
我有一张表,其中包含医疗数字和过程的列。有很多行和医疗号码可以重复许多程序;例如:如何从一个表中选择条件跨同一列的多行
Mid_no procedure
--------------------
100. 20
100. 30
200. 30
我想选择具有程序30和不具有程序20在上述例子中所有mid_no
,所期望的结果将是:
Mid_no. Procedure
---------------------
200. 30
SELECT t.mid_no,
t.procedure
FROM TABLE t
WHERE NOT EXISTS
(SELECT 1 FROM TABLE t1 WHERE t1.mid_no = t.mid_no AND t1.procedure = 20
)
AND t.procedure = 30;
select mid_no from table where procedure = 30
intersect
select mid_no from table where procedure != 20
只需扫描一张桌子,即可使用:
select distinct Mid_no
from (
select count(case when procedure=20 then 1 end) over (partition by Mid_no) as has20,
count(case when procedure=30 then 1 end) over (partition by Mid_no) as has30,
Mid_no
from yourTable
)
where has20 = 0
and has30 != 0
内部查询以两个不同的值计算20
和30
的出现次数,对于每个Mid_no
;外部人只挑选没有发生的唯一记录20
和至少一个发生的30
。
对不起,我不明白T是我的桌子什么是T1? –
@ahmeddevil它是桌子的别名。这非常有用,因此我们不必编写完整的表名来限定列。 – GurV
@ahmed在上述查询中使用您自己的表名代替** TABLE ** – GurV