首页 > 解决方案 > SQL - 遍历行两次并追溯更改值

问题描述

我正在编写一个代码,我想在其中查询数据库以更新日志实例以反映项目的最终状态。例如:

这张桌子

将被翻译为:

这张桌子

到目前为止,我的代码是:

SELECT a.ID, a.date, a.eval_group,
CASE WHEN a.date > b.date 
AND eval_group = ('completed' OR 'canceled')
THEN 
b.eval_group
ELSE
a.eval group
END AS new_eval_group

FROM temp as a
JOIN temp as b
ON a.ID = b.ID 

我不确定如何从这里开始,并希望有任何方向。我不习惯 SQL,也不知道如何使这个函数在语言中工作!

标签: sqlpostgresql

解决方案


您可以为此使用窗口函数。您似乎想要最后一个状态,您可以使用它first_value()并进行降序排序:

select t.*,
       first_value(eval_group) over (partition by id order by date desc) as new_eval_group
from t;

如果您只想“完成”和“取消”,您可以使用filter

select t.*,
       first_value(eval_group) filter (where eval_group in ('finished', 'canceled') over (partition by id order by date desc) as new_eval_group
from t;

推荐阅读