【发布时间】:2018-07-03 04:28:30
【问题描述】:
我需要找到每位患者的所有 episode_id。但是,如果在前一集的 90 天内出现重叠集,那么我只想保留最近的集。
例如patient_num 3242下面有3集:90天内第二集与第一集重叠,90天内第三集与第二集重叠,这种情况我只需要保留第三集.
CREATE TABLE table1 (episode_id nvarchar(max), patient_num nvarchar(max), admit_date date, discharge_date date)
INSERT INTO table1 (episode_id, patient_num , admit_date , discharge_date ) VALUES
('1','5743','1/1/2016','1/5/2016'),
('2','5743','4/26/2016','4/29/2016'),
('3','5743','5/26/2016','5/28/2016'),
('4','5743','9/21/2016','9/28/2016'),
('5','8859','4/27/2016','5/5/2016'),
('6','3242','4/28/2016','4/29/2016'),
('7','3242','11/21/2016','11/23/2016'),
('8','3242','11/24/2016','11/29/2016'),
('9','3242','12/12/2016','12/29/2016')
初始表(table1)
episode_id patient_num admit_date discharge_date
1 5743 2016-01-01 2016-01-05
2 5743 2016-04-26 2016-04-29
3 5743 2016-05-26 2016-05-28
4 5743 2016-09-21 2016-09-28
5 8859 2016-04-27 2016-05-05
6 3242 2016-04-28 2016-04-29
7 3242 2016-11-21 2016-11-23
8 3242 2016-11-24 2016-11-29
9 3242 2016-12-12 2016-12-29
预期结果
episode_id patient_num admit_date discharge_date
1 5743 2016-01-01 2016-01-05
3 5743 2016-05-26 2016-05-28
4 5743 2016-09-21 2016-09-28
5 8859 2016-04-27 2016-05-05
6 3242 2016-04-28 2016-04-29
9 3242 2016-12-12 2016-12-29
我的尝试:
SELECT *
FROM table1 AS a
WHERE EXISTS
(
SELECT *
FROM table1 AS b
WHERE a.episode_id != b.episode_id
AND a.patient_num= b.patient_num
AND a.admit_date BETWEEN b.discharge_date AND DATEADD(DAY, 90, b.discharge_date ))
我的脚本中的错误是,对于患者编号 3242,我得到了第 8 集和第 9 集,而我只想要第 9 集。我假设这个错误的原因是我正在单独比较每一行而不是的作为一个组,但我无法分组。此外,此脚本未显示不存在重叠的实例,例如 episode_id 1、4、5、6。对此方法有何建议?
【问题讨论】:
-
给我们脚本来生成上面的表格
-
我添加了一个脚本来生成表格
-
我从数据中看到这是不正确的:他的第二集在 90 天内与第一集重叠
-
第一集和第二集相隔112天。
-
恕我直言,我们需要选择所有 NON_Overlapped 行。然后从其他人中创建 OverlapRanges 并从每个 OverlapRange 中选择 TOP 1。例如请克隆第 7、8、9 集并将它们的年份更改为 2017 年。我尚未解决的部分是创建 OverlapRange。我正在使用 Celko-s 对 Smarties 的 SQL 中的 Overlap 定义,这与 BETWEEN 略有不同,其中包括端点,而 Overlap 没有。
标签: sql sql-server overlapping