我一直在尝试创建一个在当前行为空时重复最后一行结果的查询,例如:
这是我的数据:
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
任何人都知道如何做到这一点?
谢谢,
答案 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