如何在sql中基于组内的条件查找行?

时间:2018-06-27 19:22:49

标签: sql sql-server

我需要找到所有行,同一位患者的不同发作之间的入院日期在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;

2 个答案:

答案 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

希望这会有所帮助

相关问题