仅当前一行与当前行不同时才从前一行中获取值 [MySQL]
Fetching values from previous rows only if it is different from the current row [MySQL]
这是针对单个患者的 table 的一部分,其中我们有一些患者及其当前的 Rx 填充日期,drug_names 和其他一些东西。所以基本上,您会看到此列 'Prev_Other_Drug_Date',其中包含与当前药物不同的最后一次处方药的日期。所以对于前 3 行,它是空的,因为 drug_names 是相同的“AKSTRIA”。对于 Row_Num 5,我们有最后一种药物的日期,它与以前的药物不同。
我不明白我应该如何着手实现这一目标。任何帮助将不胜感激。
您可以将其视为间隙和孤岛问题。这是使用 window 函数的解决方案:
select t.*,
max(lag_fill_dt) over(partition by patient_id, grp) as prev_other_drug_date
from (
select t.*,
count(lag_fill_dt) over(partition by patient_id order by fill_dt) as grp
from (
select t.*,
case when drug_name <> lag(drug_name) over(partition by patient_id order by fill_dt)
then lag(fill_dt) over(partition by patient_id order by fill_dt)
end as lag_fill_dt
from mytable t
) t
) t
思路是比较同一患者当前行和上一行的药品名称;如果它们不同,那么我们保留以前的日期。然后我们可以使用另一层嵌套来为每个组带来最新的非空日期。
这是针对单个患者的 table 的一部分,其中我们有一些患者及其当前的 Rx 填充日期,drug_names 和其他一些东西。所以基本上,您会看到此列 'Prev_Other_Drug_Date',其中包含与当前药物不同的最后一次处方药的日期。所以对于前 3 行,它是空的,因为 drug_names 是相同的“AKSTRIA”。对于 Row_Num 5,我们有最后一种药物的日期,它与以前的药物不同。
我不明白我应该如何着手实现这一目标。任何帮助将不胜感激。
您可以将其视为间隙和孤岛问题。这是使用 window 函数的解决方案:
select t.*,
max(lag_fill_dt) over(partition by patient_id, grp) as prev_other_drug_date
from (
select t.*,
count(lag_fill_dt) over(partition by patient_id order by fill_dt) as grp
from (
select t.*,
case when drug_name <> lag(drug_name) over(partition by patient_id order by fill_dt)
then lag(fill_dt) over(partition by patient_id order by fill_dt)
end as lag_fill_dt
from mytable t
) t
) t
思路是比较同一患者当前行和上一行的药品名称;如果它们不同,那么我们保留以前的日期。然后我们可以使用另一层嵌套来为每个组带来最新的非空日期。