首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >比较日期与事件发生困境

比较日期与事件发生困境
EN

Stack Overflow用户
提问于 2018-06-11 14:16:04
回答 2查看 34关注 0票数 1

我有一张桌子如下:

代码语言:javascript
复制
PatientID  DiseaseCode  DiseaseDate
1          xhd8         23-5-2006
1          nxhd         07-9-2013
2          kdeh         15-3-1998

其中:

  • xhd8 =糖尿病
  • 糖尿病已痊愈(治愈)
  • 心脏病

我如何写一个查询,告诉我如果这个病人(#1)仍然积极诊断为糖尿病,逻辑应该是这样的:病人有xhd8吗?如果是->他是否有nxhd(治愈)?>它是否治愈了后,他被诊断为?如果是->不要给我看病人,如果他没有解析代码,或者在诊断前它被记录为已解决,那就给我看看病人。

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

代码语言:javascript
复制
PatientID  DiseaseCode  DiseaseDate
1          xhd8         23-8-2014
1          nxhd         09-3-1996
2          kdeh         15-3-1998

不幸的是,更改db模式超出了我的权限。

任何想法都是受欢迎和赞赏的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-11 14:58:31

NOT EXISTS应该能做到这一点。注意我的例子和评论。

代码语言:javascript
复制
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
);
票数 0
EN

Stack Overflow用户

发布于 2018-06-11 15:16:09

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

代码语言:javascript
复制
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。我评论这个,是为了避免一个空集。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50799881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档