back/front 在 SQL 中填充值
back/front filling values in SQL
我在 PrestoSQL 中有 table,如下所示:
test
id value timestamp
1 foo blue 2019-10-17 17:42:52
2 foo <NA> 2019-10-17 17:43:52
3 foo <NA> 2019-10-17 17:44:52
4 foo red 2019-10-17 17:45:52
5 foo <NA> 2019-10-17 17:46:52
6 bar <NA> 2019-10-17 17:47:52
7 bar green 2019-10-17 17:48:52
8 bar <NA> 2019-10-17 17:49:52
9 bar <NA> 2019-10-17 17:50:52
10 bar <NA> 2019-10-17 17:51:52
我的objective是填写value
中出现的值 例如:
output
id value timestamp
1 foo blue 2019-10-17 17:42:52
2 foo blue 2019-10-17 17:43:52
3 foo blue 2019-10-17 17:44:52
4 foo red 2019-10-17 17:45:52
5 foo red 2019-10-17 17:46:52
6 bar <NA> 2019-10-17 17:47:52
7 bar green 2019-10-17 17:48:52
8 bar green 2019-10-17 17:49:52
9 bar green 2019-10-17 17:50:52
10 bar green 2019-10-17 17:51:52
我知道如何使用 lead()
和 lag()
,但是如果它不是 NA ?
如有任何建议,我们将不胜感激
您需要使用 lag()
with IGNORE NULLS
。示例:
presto:default> SELECT
-> a, t, v,
-> coalesce(v, lag(v, 1) IGNORE NULLS OVER (PARTITION BY a ORDER BY t))
-> FROM (VALUES
-> ('a', 1, 'red'),
-> ('a', 2, NULL),
-> ('a', 3, 'blue'),
-> ('a', 4, NULL),
-> ('a', 5, NULL)
-> ) t(a, t, v);
->
a | t | v | _col3
---+---+------+-------
a | 1 | red | red
a | 2 | NULL | red
a | 3 | blue | blue
a | 4 | NULL | blue
a | 5 | NULL | blue
(5 rows)
(在 Presto 322 中测试)
我在 PrestoSQL 中有 table,如下所示:
test
id value timestamp
1 foo blue 2019-10-17 17:42:52
2 foo <NA> 2019-10-17 17:43:52
3 foo <NA> 2019-10-17 17:44:52
4 foo red 2019-10-17 17:45:52
5 foo <NA> 2019-10-17 17:46:52
6 bar <NA> 2019-10-17 17:47:52
7 bar green 2019-10-17 17:48:52
8 bar <NA> 2019-10-17 17:49:52
9 bar <NA> 2019-10-17 17:50:52
10 bar <NA> 2019-10-17 17:51:52
我的objective是填写value
中出现的值 例如:
output
id value timestamp
1 foo blue 2019-10-17 17:42:52
2 foo blue 2019-10-17 17:43:52
3 foo blue 2019-10-17 17:44:52
4 foo red 2019-10-17 17:45:52
5 foo red 2019-10-17 17:46:52
6 bar <NA> 2019-10-17 17:47:52
7 bar green 2019-10-17 17:48:52
8 bar green 2019-10-17 17:49:52
9 bar green 2019-10-17 17:50:52
10 bar green 2019-10-17 17:51:52
我知道如何使用 lead()
和 lag()
,但是如果它不是 NA ?
如有任何建议,我们将不胜感激
您需要使用 lag()
with IGNORE NULLS
。示例:
presto:default> SELECT
-> a, t, v,
-> coalesce(v, lag(v, 1) IGNORE NULLS OVER (PARTITION BY a ORDER BY t))
-> FROM (VALUES
-> ('a', 1, 'red'),
-> ('a', 2, NULL),
-> ('a', 3, 'blue'),
-> ('a', 4, NULL),
-> ('a', 5, NULL)
-> ) t(a, t, v);
->
a | t | v | _col3
---+---+------+-------
a | 1 | red | red
a | 2 | NULL | red
a | 3 | blue | blue
a | 4 | NULL | blue
a | 5 | NULL | blue
(5 rows)
(在 Presto 322 中测试)