当前位置: 首页 > article >正文

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


http://www.kler.cn/a/379481.html

相关文章:

  • 科研绘图系列:R语言组合连线图和箱线图(linechart+boxplot)
  • 鸿蒙进阶-AlphabetIndexer组件
  • Jest进阶知识:React组件的单元测试
  • 私有化视频平台EasyCVR视频汇聚平台接入RTMP协议推流为何无法播放?
  • 嵌入式——了解stm32
  • STM32MP135 linux6.1.82版本移植RTL8723DS WIFI驱动
  • 程序《工资分类收税》
  • 2024/11/3 随笔笔记
  • 深度学习笔记之BERT(一)BERT的基本认识
  • 利用Spring Boot框架打造信息学科平台
  • Golang | Leetcode Golang题解之第520题检测大写字母
  • GitHub、Gitee、GitLab介绍
  • [spring源码]spring推断构造方法
  • 【深入浅出】深入浅出Bert(附面试题)
  • Ubuntu 开通 SSH 连接方式指南
  • 论文阅读笔记Dense Passage Retrieval for Open-Domain Question Answering
  • 突破自闭症治疗的创新方法和评估
  • 数据库动态扩容:Java实现与技术策略
  • Spring Boot——配置文件
  • 基于Python的乡村居民信息管理系统【附源码】
  • 国自然基金项目撰写技巧
  • LeetCode100之盛最多水的容器(11)--Java
  • 【JAVA】第3关:素数链
  • HJ43 迷宫问题
  • 虚拟机安装
  • 危机来临前---- 力扣: 876