考虑一个记录访问量的表
create table visits (
person varchar(10),
ts timestamp,
somevalue varchar(10)
)
考虑这个示例数据(时间戳简化为计数器)
ts| person | somevalue
-------------------------
1 | bob |null
2 | bob |null
3 | jim |null
4 | bob | A
5 | bob | null
6 | bob | B
7 | jim | X
8 | jim | Y
9 | jim | null
我正在尝试将该人的最后一个非空的somevalue延续到他以后的所有访问中,直到该值改变(即成为下一个非空)的值。
预期结果集如下所示:
ts| person | somevalue | carry-forward
-----------------------------------------------
1 | bob |null | null
2 | bob |null | null
3 | jim |null | null
4 | bob | A | A
5 | bob | null | A
6 | bob | B | B
7 | jim | X | X
8 | jim | Y | Y
9 | jim | null | Y
我的尝试如下所示:
select *,
first_value(somevalue) over (partition by person order by (somevalue is null), ts rows between UNBOUNDED PRECEDING AND current row ) as carry_forward
from visits
order by ts
注意:出于排序目的,(somevalue为null)求值为1或0,因此我可以获取分区中的第一个非null值。
上面没有给我我想要的结果。
@a_horse_with_no_name应该是一个答案。
—
ypercubeᵀᴹ
pg_dump
为测试数据粘贴,而不是将数据粘贴到psql输出以及表的模式中吗?pg_dump -t table -d database
我们需要创建和COPY
命令。