我有一张桌子如下:
PatientID DiseaseCode DiseaseDate
1 xhd8 23-5-2006
1 nxhd 07-9-2013
2 kdeh 15-3-1998其中:
我如何写一个查询,告诉我如果这个病人(#1)仍然积极诊断为糖尿病,逻辑应该是这样的:病人有xhd8吗?如果是->他是否有nxhd(治愈)?>它是否治愈了后,他被诊断为?如果是->不要给我看病人,如果他没有解析代码,或者在诊断前它被记录为已解决,那就给我看看病人。
在上面的例子中,糖尿病患者在诊断后已经痊愈,所以不会返回任何东西。但是,在下面的示例中,我希望返回病人记录:
PatientID DiseaseCode DiseaseDate
1 xhd8 23-8-2014
1 nxhd 09-3-1996
2 kdeh 15-3-1998不幸的是,更改db模式超出了我的权限。
任何想法都是受欢迎和赞赏的。
发布于 2018-06-11 14:58:31
NOT EXISTS应该能做到这一点。注意我的例子和评论。
DECLARE @table TABLE (PatientID int, DiseaseCode varchar(10), DiseaseDate date);
INSERT @table VALUES
(1,'xhd8','20060523'),
(1,'nxhd','20130907'),
(2,'kdeh','19980315');
-- Should return nothing
SELECT *
FROM @table t
WHERE t.DiseaseCode = 'xhd8'
AND NOT EXISTS
(
SELECT 1
FROM @table t2
WHERE t.PatientID = t2.PatientID
AND t2.DiseaseCode = 'nxhd'
AND t2.DiseaseDate > t.DiseaseDate
);
DELETE FROM @table;
INSERT @table VALUES
(1,'xhd8','20140823'),
(1,'nxhd','19960309'),
(2,'kdeh','19980315');
-- should return employee ID=1 with diseaseCode = 'xhd8'
SELECT *
FROM @table t
WHERE t.DiseaseCode = 'xhd8'
AND NOT EXISTS
(
SELECT 1
FROM @table t2
WHERE t.PatientID = t2.PatientID
AND t2.DiseaseCode = 'nxhd'
AND t2.DiseaseDate > t.DiseaseDate
);发布于 2018-06-11 15:16:09
如果我对你的理解是正确的,你可以试试这个:
SET DATEFORMAT DMY;
DECLARE @tbl TABLE(PatientID INT,DiseaseCode VARCHAR(10), DiseaseDate DATE);
INSERT INTO @tbl VALUES
(1,'xhd8','23-5-2006')
,(1,'nxhd','07-9-2013')
,(2,'kdeh','15-3-1998');
SELECT MostCurrenntDiabetes.*
FROM
(
SELECT TOP 1 WITH TIES t.*
FROM @tbl t
WHERE t.DiseaseCode IN('xhd8','nxhd')
ORDER BY ROW_NUMBER() OVER(PARTITION BY t.PatientID ORDER BY t.DiseaseDate DESC)
) AS MostCurrenntDiabetes
--WHERE MostCurrenntDiabetes.DiseaseCode='xhd8';将SELECT TOP 1 WITH TIES与一个ROW_NUMBER() OVER(PARTITION BY ...)一起使用将返回带有的所有行,作为排序等级。这意味着,你得到了每一个病人的最后(最年轻的)排。
WHERE在内部SELECT将减少行的任何糖尿病相关疾病患者(任何其他将不会出现在最后。
最后一个WHERE将只返回这些病人,其中最年轻的代码是xhd8。我评论这个,是为了避免一个空集。
也许你需要别的东西..。
https://stackoverflow.com/questions/50799881
复制相似问题