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 的执行效率也不会很差。

相关推荐
范什么特西7 分钟前
狂神--守护线程
java·linux·服务器
ID_180079054739 分钟前
Python采集京东商品详情:基于官方API的规格与价格获取
开发语言·数据库·python
w_t_y_y10 分钟前
数据库连接池(一)HikariCP
数据库
何中应17 分钟前
CentOS7安装Maven
java·运维·后端·maven
大鹏说大话34 分钟前
Windows 下将 Java 项目打包为 Docker 容器并部署的完整指南
java·windows·docker
Zachery Pole36 分钟前
JAVA_03_运算符
java·开发语言·前端
张万森爱喝可乐39 分钟前
Java 8 新特性探秘:开启现代Java开发之旅
java
毕设源码-邱学长1 小时前
【开题答辩全过程】以 基于java的网上书店管理系统为例,包含答辩的问题和答案
java·开发语言
消失的旧时光-19431 小时前
第二十二课:领域建模入门——从业务中“提炼结构”(认知篇)
java·spring boot·后端·domain
Gogo8161 小时前
同一个 new,不同的世界:Java 与 TypeScript 对象创建机制的降维打击
java·开发语言·typescript