首页 > 解决方案 > 一种只选择表示进展的行而忽略表示恢复的行的方法?

问题描述

我有一个包含数千名患者的数据集,其中包括他们的 ID 和随着时间推移的疾病阶段。数据很复杂,因为有些患者病情恶化,然后康复,然后再次恶化。我只想从患者中选择表明疾病进展的行。

例如,ID 1 从 3 > 4 进展,然后恢复到第 1 阶段,然后再次恶化到第 5 阶段。如何忽略指示恢复的行,只保留指示随时间进展的行?这甚至可以使用 SQL 吗?先感谢您!

数据是什么样的:

ID   stage_date  disease_stage
1    1-JAN-15         3
1    3-JAN-15         4
1    6-JAN-15         1
1    9-JAN-15         5
1    10-JAN-15        1

我想要的是:

ID   stage_date  disease_stage
1    1-JAN-15         3
1    3-JAN-15         4
1    9-JAN-15         5

标签: sql

解决方案


如果我理解正确,您需要与累积最大值匹配的行:

select t.*
from (select t.*,
             max(disease_stage) over (partition by id order by disease_stage) as max_running_disease_stage
      from t
     ) t
where max_running_disease_stage = disease_stage;

这将保持联系。如果你不想要领带:

select t.*
from (select t.*,
             max(disease_stage) over (partition by id 
                                      order by stage_date
                                      rows between unbounded preceding and 1 preceding
                                     ) as max_running_disease_stage
      from t
     ) t
where max_running_disease_stage is null or
      disease_stage > max_running_disease_stage;

推荐阅读