【问题标题】:back/front filling values in SQLSQL中的后/前填充值
【发布时间】:2020-12-30 08:17:24
【问题描述】:

我在 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

我的目标是填写出现在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,如何编写查询以通过时间戳(和 id)从先前已知值中填充当前值?

任何建议将不胜感激

【问题讨论】:

    标签: sql presto trino


    【解决方案1】:

    您需要将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)
    

    (在 Presto 322 中测试)

    【讨论】:

    • PrestoSQL 中没有这个选项
    • 是的。现在用一个工作示例更新了答案。
    猜你喜欢
    • 2022-12-03
    • 2020-06-08
    • 2020-04-13
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 2021-03-26
    相关资源
    最近更新 更多