PostgreSQL:当前行为空时重复最后一行结果的查询

时间:2014-03-25 21:40:58

标签: sql postgresql

我一直在尝试创建一个在当前行为空时重复最后一行结果的查询,例如:

这是我的数据:

A1  |   B2
--------------
1   |   2
2   |   1
3   |   (null)
4   |   (null)
5   |   3

所以我希望如此:

A1  |   B2
--------------
1   |   2
2   |   1
3   |   1
4   |   1
5   |   3

当值为null时,我想填充最后一行结果。我试过了:

SELECT A1, COALESCE (B2, Last_Value (B2) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING)) AS B2 FROM

(SELECT 1 AS A1, 2 AS B2
UNION ALL
SELECT 2, 1
UNION ALL
SELECT 3, NULL
UNION ALL
SELECT 4, NULL
UNION ALL
SELECT 5, 3) TAB

但结果是:

A1  |   B2
--------------
1   |   2
2   |   1
3   |   1
4   |   (null)
5   |   3

任何人都知道如何做到这一点?

谢谢,

1 个答案:

答案 0 :(得分:2)

唉,Postgres不支持ignore null的{​​{1}}选项。但你仍然可以这样做。

这个想法是在每行之前用B2中的值计算行数。我假设A1给出了值的排序。然后,您可以在此范围内使用lag()来指定值。

max()

我认为select t.a1, coalesce(t.b1, max(b2) over (partition by grp)) as b2 from (select t.*, sum(case when b2 is null then 0 else 1 end) over (order by a1) as grp from tab t ) t; 是必要的,因为即使coalesce()不为空,max()也应计算正确的值。但是,我认为它使代码更清晰。

编辑:

上述查询可以略微简化为:

b2
相关问题