如何在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 |