比较日期和事件发生的困境



>我有一个表格如下:

PatientID  DiseaseCode  DiseaseDate
1          xhd8         23-5-2006
1          nxhd         07-9-2013
2          kdeh         15-3-1998

哪里:

  • xhd8 = 糖尿病
  • NXHD = 糖尿病已消退(治愈(
  • KDEH = 心脏病

我怎么能写一个查询,告诉我这个病人是否仍然主动诊断为糖尿病,逻辑应该是这样的: 患者有XHD8吗?如果是,>他有NXHD(治愈(吗?>他被诊断出来后是否治愈了?如果是>不要给我看病人,如果他没有解析的代码,或者在诊断前被记录为已解决,那么给我看病人。

在上面的例子中,患者的糖尿病在诊断后已经消退(治愈(,所以它不会返回任何东西。 但是在下面的示例中,我希望返回患者记录:

PatientID  DiseaseCode  DiseaseDate
1          xhd8         23-8-2014
1          nxhd         09-3-1996
2          kdeh         15-3-1998

不幸的是,更改数据库模式超出了我的许可。

欢迎和赞赏任何想法。

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
);

如果我理解正确,你可以试试这个:

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 TIESROW_NUMBER() OVER(PARTITION BY ...)一起使用将返回所有带有1的行作为排序排名。这意味着,您将获得每位患者的最后一行(最年轻(。

SELECT中的WHERE将减少任何糖尿病相关疾病代码患者的行数(任何其他疾病都不会显示在末尾。

最后的WHERE将只返回这些患者,其中最年轻的代码是xhd8。我对此进行了评论,以避免空集。

也许你需要别的东西...

最新更新