impalasql算法

ltqd579y  于 2021-06-26  发布在  Impala
关注(0)|答案(1)|浏览(300)

我有处方药数据,有一个处方日期和天数为该处方提供。我试图估计实际的药物摄入日期,这可能是不同的处方日期,如果人们(1)重新填写他们的处方之前,他们目前的处方完成或(2)他们失去了他们目前的处方,所以需要重新填写。
以下是1名患者的样本数据:

| patient_id | rx_start_date | days_supply |
|------------|---------------|-------------|
| 1          | 1/10/2013     | 3           |
| 1          | 1/11/2013     | 3           |
| 1          | 1/14/2013     | 3           |

在不调整库存的情况下,结束日期按接收开始日期+供应天数计算,见:

| patient_id | rx_start_date | days_supply | rx_end_date |
|------------|---------------|-------------|-------------|
| 1          | 1/10/2013     | 3           | 1/12/2013   |
| 1          | 1/11/2013     | 3           | 1/13/2013   |
| 1          | 1/14/2013     | 3           | 1/16/2013   |

如您所见,第二个处方的开始日期与第一个处方重叠。如果我们假设他们提前完成处方,那么第二个处方的实际服用日期应该从2013年1月13日开始。但是移动第二个处方的结束日期会导致与第三个处方重叠,因此也必须移动。见下表:

| patient_id | rx_start_date | days_supply | rx_end_date |
|------------|---------------|-------------|-------------|
| 1          | 1/10/2013     | 3           | 1/12/2013   |
| 1          | 1/13/2013     | 3           | 1/15/2013   |
| 1          | 1/16/2013     | 3           | 1/18/2013   |

另一种情况是,我们可能会说,如果当前处方与下一个处方重叠超过50%,那么我们假设他们丢失了处方,第二个处方开始日期就是实际服用日期。这意味着我们需要截断当前处方,以便在第二个处方开始时结束。
使用非sql迭代解决方案的算法相对简单,但我在使用通用sql解决方案时遇到了问题,因为在时间x调整日期可能会导致调整许多其他日期的级联效应。我使用的是impala sql,所以递归cte不是一个选项,我希望它能在其他数据库上工作,所以特定于数据库的函数也不理想。

sqxo8psd

sqxo8psd1#

只要治疗方案中没有空白,以下内容就可以满足您的需求:

with aggs as (select d1.patient_id, d1.rx_start_dt, sum(ds.days_supply) days_supply, min(ds.rx_start_dt) + sum(ds.days_supply) - 1 end_dt 
          from drugs d1
          inner join drugs ds
            on ds.patient_id = d1.patient_id and ds.rx_start_dt <= d1.rx_start_dt
          group by d1.patient_id, d1.rx_start_dt)
select patient_id, coalesce(lag(end_dt+1) over (partition by patient_id order by rx_start_dt),rx_start_dt) start_dt, end_dt
from aggs;

使用给定的样本数据,这将作为输出:

ID  Start       End
1   2013-01-10  2013-01-12 
1   2013-01-13  2013-01-15 
1   2013-01-16  2013-01-18

这是在oracle上测试过的,但是所有使用的函数似乎在impala中也可以使用,所以应该在那里也可以使用。

相关问题