SQL中的后/前填充值

the*_*ide 0 sql presto

我在PrestoSQL中有如下表:

 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
Run Code Online (Sandbox Code Playgroud)

我的目标是在值出现之后填写这些值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
Run Code Online (Sandbox Code Playgroud)

我知道如何使用lead()lag(),但是如果不是NA,将如何编写查询以通过时间戳(和id)从先前的已知值中填充当前值?

任何建议,将不胜感激

Pio*_*sen 5

您需要使用lag()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)
Run Code Online (Sandbox Code Playgroud)

(在Presto 322中测试)

  • 它是。现在用一个工作示例更新了答案。 (2认同)