我有一张患者表,其中包含患者所具有的病症等详细信息。从下表中我想选择只有一个病症的患者,索赔 - “高血压”。示例患者B是预期输出。不会选择患者A,因为他声称患有多种疾病。
+----+---------+--------------+
| ID | ClaimID | Condition |
+----+---------+--------------+
| A | 14234 | Hypertension |
| A | 14234 | Diabetes |
| A | 63947 | Diabetes |
| B | 23853 | Hypertension |
+----+---------+--------------+
我尝试使用NOT IN条件如下,但似乎没有帮助
SELECT ID, ClaimID, Condition
FROM myTable
WHERE Condition IN ('Hypertension')
AND Condition NOT IN ('Diabetes')
答案 0 :(得分:2)
一种方法使用not exists
:
select t.*
from mytable t
where t.condition = 'Hypertension' and
not exists (select 1
from mytable t2
where t2.id = t.id and t2.condition <> t.condition
);
答案 1 :(得分:2)
或者你可以这样做:
select
id,
claim_id,
condition
from
patient
where
id in
(
select
id
from
patient
group by
id having count (distinct condition) = 1
);
结果:
id claim_id condition
-- ----------- ----------------
B 23853 Hypertension
(1 rows affected)
设定:
create table patient
(
id varchar(1),
claim_id int,
condition varchar(16)
);
insert into patient (id, claim_id, condition) values ('A', 14234, 'Hypertension');
insert into patient (id, claim_id, condition) values ('A', 14234, 'Diabetes');
insert into patient (id, claim_id, condition) values ('A', 63947, 'Diabetes');
insert into patient (id, claim_id, condition) values ('B', 23853, 'Hypertension');
答案 2 :(得分:0)
您可以使用CTE执行此操作。
我使用两个参数设置此CTE,一个是您寻找的条件,另一个是要查找的组合条件的最大数量(在您的情况下为1)。
DECLARE @myTable TABLE (Id VARCHAR(1), ClaimID INT, Condition VARCHAR(100))
INSERT INTO @myTable (Id, ClaimID, Condition)
SELECT 'A',14234,'Hypertension' UNION ALL
SELECT 'A',14234,'Diabetes' UNION ALL
SELECT 'A',63947,'Diabetes' UNION ALL
SELECT 'B',23853,'Hypertension'
DECLARE @Condition VARCHAR(100)
DECLARE @MaxConditions TINYINT
SET @Condition='Hypertension'
SET @MaxConditions=1
; WITH CTE AS
(
SELECT *, COUNT(2) OVER(PARTITION BY ClaimID) AS CN
FROM @myTable T1
WHERE EXISTS (SELECT 1 FROM @myTable T2 WHERE T1.ClaimID=T2.ClaimID AND T2.Condition=@Condition)
)
SELECT *
FROM CTE
WHERE CN<=@MaxConditions
如果你不关心绒毛,只想让所有的ClaimID只有一个条件,无论它使用的是什么条件。
DECLARE @myTable TABLE (Id VARCHAR(1), ClaimID INT, Condition VARCHAR(100))
INSERT INTO @myTable (Id, ClaimID, Condition)
SELECT 'A',14234,'Hypertension' UNION ALL
SELECT 'A',14234,'Diabetes' UNION ALL
SELECT 'A',63947,'Diabetes' UNION ALL
SELECT 'B',23853,'Hypertension'
DECLARE @MaxConditions TINYINT
SET @MaxConditions=1
; WITH CTE AS
(
SELECT *, COUNT(2) OVER(PARTITION BY ClaimID) AS CN
FROM @myTable T1
)
SELECT *
FROM CTE
WHERE CN<=@MaxConditions
答案 3 :(得分:0)
这是使用Having
子句
SELECT t.*
FROM mytable t
WHERE EXISTS (SELECT 1
FROM mytable t2
WHERE t2.id = t.id
HAVING Count(CASE WHEN condition = 'Hypertension' THEN 1 END) > 0
AND Count(CASE WHEN condition != 'Hypertension' THEN 1 END) = 0)
答案 4 :(得分:0)
我决定将我的答案修改为合适的答案。
您问题的一个简单解决方案是计算行而不是ID值(因为它不是整数)。
这是一个简单的介绍:
SELECT
ID
FROM
#PatientTable
GROUP BY
ID
HAVING
ID = ID AND COUNT(*) = 1
这将返回ID B
+----+
| ID |
+----+
| B |
+----+
当然,这还不够,因为您可能需要处理大量数据并需要更多过滤。
因此,我们将把它用作子查询。
将其用作子查询很简单:
SELECT
ID,
ClaimID,
Condition
FROM
#PatientTable
WHERE
ID = (SELECT ID AS NumberOfClaims FROM #PatientTable GROUP BY ID HAVING ID = ID AND COUNT(*) = 1)
这将返回
+----+---------+--------------+
| ID | ClaimID | Condition |
+----+---------+--------------+
| B | 23853 | Hypertension |
+----+---------+--------------+
到目前为止一直很好,但我们可能面临另一个问题。假设您有来自多个患者的多个声明,使用此查询只会显示一个患者。为了显示所有患者,我们需要在WHERE子句
下使用IN
而不是=
WHERE
ID IN (SELECT ID AS NumberOfClaims FROM #PatientTable GROUP BY ID HAVING ID = ID AND COUNT(*) = 1)
这将列出所有属于这种情况的患者。
如果你需要更多的条件来过滤,你只需将它们添加到WHERE子句中,你就可以了。
答案 5 :(得分:0)
还有其他几种方法可以做到这一点:
declare @TableA table(Id char,
ClaimId int,
Condition varchar(250));
insert into @TableA (id, claimid, condition)
values ('A', 14234, 'Hypertension'),
('A', 14234, 'Diabetes'),
('A', 63947, 'Diabetes'),
('B', 23853, 'Hypertension')
select id, claimid, condition
from @TableA a
where not exists(select id
from @TableA b
where a.id = b.id
group by b.id
having count(b.id) > 1)
OR
;with cte as
(
select id, claimid, condition
from @TableA
)
,
cte2 as
(
Select id, count(Id) as counts
from cte
group by id
having count(id) < 2
)
Select cte.id, claimid, condition
From cte
inner join
cte2
on cte.id = cte2.id
答案 6 :(得分:0)
SELECT id, sum(ct)
FROM (SELECT customer_id, CASE WHEN category = 'X' THEN 0 else 1
end ct
FROM MASTER_TABLE
) AS t1
GROUP BY id
HAVING sum(ct) = 0
sum(ct) 大于 1 的 id,将有多个条件
答案 7 :(得分:0)
使用连接代替子查询。联接在性能上总是更好。您可以使用以下查询。
SELECT T1.id, T1.claimid, T1.Condition
FROM mytable T1
INNER JOIN
(
select id, count(Condition) counter
from mytable
group by id HAVING COUNT(DISTINCT CONDITION)=1
) T2 ON T1.ID=T2.ID
WHERE T2.counter=1