сравнение дат и дилеммы возникновения событий - PullRequest
0 голосов
/ 11 июня 2018

У меня есть следующая таблица:

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

где:

  • xhd8 = диабет
  • nxhd = диабет разрешен (вылечен)
  • kdeh = болезнь сердца

Как я могу написать один запрос, чтобы сказать мне, если этот пациент (# 1) все еще активно диагностируется как диабетик, логика должна быть такой: есть ли у пациентаxhd8?если да-> есть ли у него nxhd (вылеченный)? -> был ли он вылечен после ему был поставлен диагноз?если да-> не показывать мне пациента, если у него нет разрешенного кода или он был записан как разрешенный до постановки диагноза, то покажите мне пациента.

в приведенном выше примере диабет пациента имеетразрешается (вылечивается) после постановки диагноза, поэтому ничего не возвращается.однако в приведенном ниже примере я ожидаю, что будет возвращена запись о пациенте:

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

к сожалению, изменение схемы БД не разрешено мне.

любые идеи приветствуются и приветствуются.

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Если я вас правильно понял, вы можете попробовать это:

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 ...) вернет все строки с 1 в качестве ранга сортировки .Это означает, что вы получаете последний (самый младший) ряд для каждого пациента.

WHERE во внутреннем SELECT уменьшит количество строк для пациентов с любым кодом, связанным с диабетом (любой другой не будет отображатьсяв конце.

Финальный WHERE вернет только этих пациентов, где младший код xhd8 . Я прокомментировал это, чтобы избежать пустого набора.

Может быть, вам нужно что-то еще ...

0 голосов
/ 11 июня 2018

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
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...