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

相关推荐
无巧不成书02184 小时前
30分钟入门Java:从历史到Hello World的小白指南
java·开发语言
成为大佬先秃头5 小时前
数据库连接池:Druid
数据库·mysql·druid
zs宝来了6 小时前
Playwright 自动发布 CSDN 的完整实践
java
吴声子夜歌7 小时前
TypeScript——基础类型(三)
java·linux·typescript
晓华-warm8 小时前
Warm-Flow 1.8.5 正式发布:超时自动审批、暂存功能来了!
数据库
DynamicsAgg8 小时前
企业数字化底座-k8s企业实践系列第二篇pod创建调度
java·容器·kubernetes
森林里的程序猿猿8 小时前
并发设计模式
java·开发语言·jvm
222you9 小时前
四个主要的函数式接口
java·开发语言
Javatutouhouduan9 小时前
Java全栈面试进阶宝典:内容全面,题目高频!
java·高并发·java面试·java面试题·后端开发·java程序员·java八股文