我需要找到所有行,同一位患者的不同发作之间的入院日期在90天内。情节只是将各种就诊相关的各种就诊分组在一起。
在下面的示例中,patient_num 5743
有三集。在这里,我需要检查该患者发作之间的admit_dates。如果某个情节中的任何允许日期都在另一个情节的90天内,那么我想返回这些情节的所有行。
数据集(表1):
episode_id patient_num admit_date
1 5743 2016-03-29
1 5743 2016-04-26
2 5743 2016-04-26
3 5743 2017-04-21
5 3242 2016-04-27
5 3242 2016-04-28
6 3242 2016-11-21
6 3242 2016-11-24
预期结果:
episode_id patient_num admit_date
1 5743 2016-03-29
1 5743 2016-04-26
2 5743 2016-04-26
我尝试使用CTE:
WITH a_cte
AS (
SELECT episode_id,
patient_num,
admit_date
FROM table1)
SELECT episode_id,
patient_num,
admit_date
FROM table1
LEFT JOIN a_cte ON a_cte.episode_id = b.episode_id
WHERE a_cte.admit_date = b.admit_date
ORDER BY b.patient_num,
b.episode_id;
最终工作代码:
SELECT a.episode_id,
a.patient_num,
a.admit_date
FROM table1 AS a
WHERE EXISTS
(
SELECT *
FROM table1 AS b
WHERE b.admit_date BETWEEN a.admit_date AND DATEADD(day, 89, a.admit_date)
AND b.patient_num = a.patient_num
AND a.episode_id = b.episode_id
)
ORDER BY a.patient_num,
a.episode_id;
答案 0 :(得分:1)
如果一个情节中的任何录取日期位于另一个情节的90天内 然后我要返回这些情节的所有行。
任何时候您都需要这样的东西(如果有的话),您应该想到EXISTS()。用伪代码:
SELECT ...
WHERE EXISTS(SELECT ... WHERE Subquery.PK=OuterQuery.PK and Subquery.Condition=true)
这将从表中获取所有行,其中具有相同PK的任何行都满足您要测试的条件。
答案 1 :(得分:0)
听起来您需要使用LAG之类的窗口函数将上一条记录的日期显示在同一行上,使用datediff来获取它们之间的日期。
然后过滤datediff(lag(admitdate)> 90
滞后和datediff函数的链接:
https://docs.microsoft.com/en-us/sql/t-sql/functions/lag-transact-sql?view=sql-server-2017
日期
https://docs.microsoft.com/en-us/sql/t-sql/functions/datediff-transact-sql?view=sql-server-2017
希望这会有所帮助