SQL-两次遍历行并追溯更改值

时间:2019-03-04 14:22:34

标签: sql postgresql

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

this table

将被翻译为:

this table

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

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,也不知道如何使该功能在语言中起作用!

1 个答案:

答案 0 :(得分:1)

您可以为此使用窗口功能。您似乎想要最后一个状态,可以使用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;