PostgreSQL 取前一列不为 NULL

PostgreSQL 取前一列不为 NULL 的值

案例:假设有如下一个表,其结构和数据如下。根据需求写出对应的 SQL。

date lv income

2021-01-01 1.1 100

2021-01-02 1.2 300

2021-01-03 1.3 301

2021-01-05 303

2021-01-06 1.8 304

2021-01-07 1.9 305

2021-01-04 302

需求:当 lv 为 NULL 时,取 date 小于当前 date 的 lv 不为 NULL 的 date 的 lv

解法1:

SELECT date,

lv,

income,

CASE WHEN lv IS NOT NULL THEN lv ELSE(SELECT a.lv FROM tmp AS a WHERE a.date < b.date AND a.lv IS NOT NULL ORDER BY a.date DESC LIMIT 1) END AS lv

FROM tmp AS b

ORDER BY b.date;

解法2:

SELECT date,

lv,

income,

first_value(lv) over (partition by lvs order by date)

FROM (

SELECT date,

lv,

income,

SUM(CASE WHEN lv IS NULL THEN 0 ELSE 1 END) OVER (ORDER BY date) AS lvs

FROM tmp

ORDER BY date ASC ) AS b;

解法一的思路非常的巧妙,并且 SQL 的执行效率也不会很差。

相关推荐
码出财富18 小时前
SpringBoot 内置的 20 个高效工具类
java·spring boot·spring cloud·java-ee
正在走向自律18 小时前
金仓数据库KingbaseES中级语法详解与实践指南
数据库·oracle·kingbasees·金仓数据库·信创改造
Gofarlic_oms118 小时前
Windchill用户登录与模块访问失败问题排查与许可证诊断
大数据·运维·网络·数据库·人工智能
我是小疯子6619 小时前
Python变量赋值陷阱:浅拷贝VS深拷贝
java·服务器·数据库
森叶19 小时前
Java 比 Python 高性能的原因:重点在高并发方面
java·开发语言·python
二哈喇子!19 小时前
Eclipse中导入外部jar包
java·eclipse·jar
微露清风19 小时前
系统性学习C++-第二十二讲-C++11
java·c++·学习
Shi_haoliu19 小时前
SolidTime 在 Rocky Linux 9.5 上的完整部署流程
linux·运维·nginx·postgresql·vue·php·laravel
Zoey的笔记本19 小时前
2026告别僵化工作流:支持自定义字段的看板工具选型与部署指南
大数据·前端·数据库
静听山水19 小时前
docker安装starrocks
数据库