Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PostgreSQL窗口函数中忽略空值?或返回列中的下一个非空值_Sql_Postgresql - Fatal编程技术网

如何在PostgreSQL窗口函数中忽略空值?或返回列中的下一个非空值

如何在PostgreSQL窗口函数中忽略空值?或返回列中的下一个非空值,sql,postgresql,Sql,Postgresql,假设我有下表: | User_id | COL1 | COL2 | +---------+----------+------+ | 1 | | 1 | | 1 | | 2 | | 1 | 2421 | | | 1 | | 1 | | 1 | 3542 | | | 2 |

假设我有下表:

 | User_id |   COL1   | COL2 |
 +---------+----------+------+
 | 1       |          | 1    |
 | 1       |          | 2    | 
 | 1       |   2421   |      | 
 | 1       |          | 1    | 
 | 1       |   3542   |      | 
 | 2       |          | 1    |
我需要另一列指示每行的下一个非空COL1值,因此结果如下所示:

 | User_id |   COL1   | COL2 | COL3 |
 +---------+----------+------+------
 | 1       |          | 1    | 2421 |
 | 1       |          | 2    | 2421 |
 | 1       |   2421   |      |      |
 | 1       |          | 1    | 3542 |
 | 1       |   3542   |      |      |
 | 2       |          | 1    |      |


可以,但我使用的是PostgreSQL,它不支持ignore nulls子句


任何建议的解决方法?

使用相关子查询的方法总是行之有效的:

select t.*,
       (select t2.col1
        from t t2
        where t2.id >= t.id and t2.col1 is not null
        order by t2.id desc
        fetch first 1 row only
       ) as nextcol1
from t;

如果按如下顺序添加条件时,仍可以使用窗口功能执行此操作:

select
   first_value(COL1) 
   over (
     partition by user_id 
     order by case when COL1 is not null then 0 else 1 end ASC, COL2 
     rows unbounded following
   ) 
from table
这将首先使用非空值


但是,如果跳过空值,性能可能不会很好,因为数据库必须根据附加条件进行排序。

我也遇到了同样的问题。其他解决方案可能也可以,但我必须为我需要的每一行构建多个窗口

您可以尝试以下代码段:

如果创建聚合,则可以使用它们:

SELECT 
first(COL1) over (partition by user_id order by COL2 rows unbounded following) 
FROM table;
希望这有帮助

SELECT * FROM TABLE ORDER BY COALESCE(colA, colB);
哪些按colA排序,如果colA有空值,则按colB排序。

您可以使用
COALESCE()
函数。对于您的查询:

SELECT 
first_value(COALESCE(COL1)) over (partition by user_id order by COL2 rows unbounded following) 
FROM table;
但我不明白使用按COL2排序的原因是什么,因为这行的COL2值为null:

 | User_id |   COL1   | COL2 |
 +---------+----------+------+
 | 1       |          | 1    |
 | 1       |          | 2    | 
 | 1       |   2421   |      | <<--- null?
 | 1       |          | 1    | 
 | 1       |   3542   |      | <<--- null?
 | 2       |          | 1    |
|用户id | COL1 | COL2|
+---------+----------+------+
| 1       |          | 1    |
| 1       |          | 2    | 

|1 | 2421 | |您需要一列来指定顺序。SQL表本质上是无序的。运行t2.id>=t.id筛选器时找不到t.idthis@user3558238 . . . 你说找不到是什么意思
t
是外部查询中表的别名
t2
是内部查询中的别名。它表示t.user\u id不存在,可能子查询无法引用PostgreSQL中的外部查询参数?@user3558238。Postgres肯定支持相关子查询。您应该编辑您的问题并包含您的尝试。但这与
忽略空值
子句并不完全相同。
 | User_id |   COL1   | COL2 |
 +---------+----------+------+
 | 1       |          | 1    |
 | 1       |          | 2    | 
 | 1       |   2421   |      | <<--- null?
 | 1       |          | 1    | 
 | 1       |   3542   |      | <<--- null?
 | 2       |          | 1    |