在 postgres 中向前(或向后填充)
Forward (or Backward filling) in postgres
问题是在 table 中填充缺失值。在pandas中,可以使用前向(或后向)填充来实现,如下所示:
$> import pandas as pd
$> df = pd.DataFrame({'x': [None, 1, None, None, 2, None, 3, None]})
$> df['y'] = df['x'].fillna(method='ffill')
$> df
x y
0 NaN NaN
1 1 1
2 NaN 1
3 NaN 1
4 2 2
5 NaN 2
6 3 3
7 NaN 3
有没有办法在 SQL 中(更准确地说是在 PostGres 中)做到这一点?我想 window functions 可以提供帮助,但我不知道如何做。
在 PostGres 中,它就像:
sandbox=# SELECT x, ??
FROM
(SELECT NULL AS x
UNION ALL SELECT 1 AS x
UNION ALL SELECT NULL AS x
UNION ALL SELECT NULL AS x
UNION ALL SELECT 2 AS x
UNION ALL SELECT NULL AS x
UNION ALL SELECT 3 AS x
UNION ALL SELECT NULL AS x) a;
x
---
1
2
3
(8 rows)
这么多别名,因为您的查询对顺序非常敏感。
我添加了更多空 x
行以证明它被修剪为几个空行...
select x,y from (
select r,x, case when y is not null then y else min(y) over (partition by x order by r) end y from (
SELECT row_number() over() r,x, case when x is not null then x else lag(x) over () end y
FROM
(SELECT NULL AS x
UNION ALL SELECT 1 AS x
UNION ALL SELECT NULL AS x
UNION ALL SELECT NULL AS x
UNION ALL SELECT NULL AS x
UNION ALL SELECT NULL AS x
UNION ALL SELECT 2 AS x
UNION ALL SELECT NULL AS x
UNION ALL SELECT 3 AS x
UNION ALL SELECT NULL AS x
) a
) b
order by r
) c
;
问题是在 table 中填充缺失值。在pandas中,可以使用前向(或后向)填充来实现,如下所示:
$> import pandas as pd
$> df = pd.DataFrame({'x': [None, 1, None, None, 2, None, 3, None]})
$> df['y'] = df['x'].fillna(method='ffill')
$> df
x y
0 NaN NaN
1 1 1
2 NaN 1
3 NaN 1
4 2 2
5 NaN 2
6 3 3
7 NaN 3
有没有办法在 SQL 中(更准确地说是在 PostGres 中)做到这一点?我想 window functions 可以提供帮助,但我不知道如何做。
在 PostGres 中,它就像:
sandbox=# SELECT x, ??
FROM
(SELECT NULL AS x
UNION ALL SELECT 1 AS x
UNION ALL SELECT NULL AS x
UNION ALL SELECT NULL AS x
UNION ALL SELECT 2 AS x
UNION ALL SELECT NULL AS x
UNION ALL SELECT 3 AS x
UNION ALL SELECT NULL AS x) a;
x
---
1
2
3
(8 rows)
这么多别名,因为您的查询对顺序非常敏感。
我添加了更多空 x
行以证明它被修剪为几个空行...
select x,y from (
select r,x, case when y is not null then y else min(y) over (partition by x order by r) end y from (
SELECT row_number() over() r,x, case when x is not null then x else lag(x) over () end y
FROM
(SELECT NULL AS x
UNION ALL SELECT 1 AS x
UNION ALL SELECT NULL AS x
UNION ALL SELECT NULL AS x
UNION ALL SELECT NULL AS x
UNION ALL SELECT NULL AS x
UNION ALL SELECT 2 AS x
UNION ALL SELECT NULL AS x
UNION ALL SELECT 3 AS x
UNION ALL SELECT NULL AS x
) a
) b
order by r
) c
;