sql - 如何根据日期删除重叠行并在 sql 中保持最新?
问题描述
我需要找到每个病人的所有 episode_ids。但是,如果在上一集的 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 ))
我的脚本中的错误是,对于患者 num 3242
,我得到了第 8 集和第 9 集,而我只想要第 9 集。我假设这个错误的原因是我单独比较每一行而不是作为一个组,但我分组时遇到问题。此外,此脚本未显示没有重叠的实例,例如 episode_id 1、4、5、6。对这种方法有什么建议吗?
解决方案
我在这里删除了游标解决方案,因为它性能低,不使用游标的解决方案是:
WITH ExcludedIds AS (
SELECT DISTINCT T2.episode_id
FROM table1 AS T
INNER JOIN table1 AS T2 ON T.episode_id != T2.episode_id
AND T.patient_num = T2.patient_num
AND T2.discharge_date BETWEEN DATEADD(DAY, -90, T.admit_date ) AND T.discharge_date)
SELECT T.episode_id, T.patient_num, T.admit_date, T.discharge_date
FROM table1 AS T
WHERE T.episode_id NOT IN (SELECT ExcludedIds.episode_id FROM ExcludedIds)
想理解这个解决方案有点困难。
推荐阅读
- c++ - 我应该如何使用 C++ 中的 Structs 解决输入失败的问题?
- angular5 - 角度 5,使用 (ngModelChange) 更改模型时未采用新模型值
- static - SystemVerilog:自动变量不能为静态 reg 出现非阻塞赋值
- python - 在 Pandas 上过滤列表元素
- sapui5 - Ui5 中的日期选择器允许输入整数
- javascript - Javascript 运算符优先级(关联性)
- python - 将 py 文件转换为 exe,找不到现有的 PyQt5 插件目录
- ios - Objective C 中的@dynamic 属性
- java - 无法使用 Selenium Java 访问某些 URL
- javascript - 如何使儿童订单随机化器具有重置回初始订单的选项?