T-SQL:用最新的非空值替换 NULL 的最佳方法?

2024-06-19

假设我有这张表:

+----+-------+
| id | value |
+----+-------+
|  1 |     5 |
|  2 |     4 |
|  3 |     1 |
|  4 |  NULL |
|  5 |  NULL |
|  6 |    14 |
|  7 |  NULL |
|  8 |     0 |
|  9 |     3 |
| 10 |  NULL |
+----+-------+

我想编写一个查询来替换任何NULL值与表中最后一个不为空的值在那一栏里。

我想要这个结果:

+----+-------+
| id | value |
+----+-------+
|  1 |     5 |
|  2 |     4 |
|  3 |     1 |
|  4 |     1 |
|  5 |     1 |
|  6 |    14 |
|  7 |    14 |
|  8 |     0 |
|  9 |     3 |
| 10 |     3 |
+----+-------+

如果先前的值不存在,则 NULL 也可以。理想情况下,即使使用ORDER BY。举例来说,如果我ORDER BY [id] DESC:

+----+-------+
| id | value |
+----+-------+
| 10 |  NULL |
|  9 |     3 |
|  8 |     0 |
|  7 |     0 |
|  6 |    14 |
|  5 |    14 |
|  4 |    14 |
|  3 |     1 |
|  2 |     4 |
|  1 |     5 |
+----+-------+

或者如果我更好ORDER BY [value] DESC:

+----+-------+
| id | value |
+----+-------+
|  6 |    14 |
|  1 |     5 |
|  2 |     4 |
|  9 |     3 |
|  3 |     1 |
|  8 |     0 |
|  4 |     0 |
|  5 |     0 |
|  7 |     0 |
| 10 |     0 |
+----+-------+

I think这可能涉及某种分析函数 - 以某种方式对值列进行分区 - 但我不确定在哪里查找。


您可以使用运行总和来设置组并使用 max 来填充空值。

select id,max(value) over(partition by grp) as value
from (select id,value,sum(case when value is not null then 1 else 0 end) over(order by id) as grp
      from tbl
     ) t

改变over()条款至order by value desc得到问题的第二个结果。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

T-SQL:用最新的非空值替换 NULL 的最佳方法? 的相关文章

  • 无法将 null 值插入列...当值不为 null 时

    在我的 C 代码中 我在数据库中有一个插入 但它引发了异常 无法将 NULL 值插入表 Moroccanoil Replicated dbo Boxes 的 BoxID 列 列不允许为空 插入失败 然而 在调试这段代码时 我发现该框实际上不
  • MySQL - 将字段的默认值设置为字符串连接函数

    我有一个看起来有点像这个的表 actor forename surname stage name 我想将 stage name 更新为默认值 forename surname So that insert into actors foren
  • SQL Server:十进制精度/小数位数产生奇怪的结果

    我正在为一个项目编写一些 SQL 我注意到 SQL Server 中一些看似奇怪的行为 涉及除以小数时的答案 以下是一些示例 说明了我所看到的行为 DECLARE Ratio Decimal 38 16 SET Ratio CAST 210
  • 有没有办法将加密的脚本插入 SQL Server 数据库?

    我的公司认为我们编写的数据库脚本是我们知识产权的一部分 在新版本中 我们为用户提供了由两部分组成的设置 桌面应用程序 一个可执行文件 它包含了初始化 更新数据库的复杂性 RedGate SQL Packager 我知道一旦脚本存在我就可以加
  • MS SQL 2005 备份能否恢复到 MS SQL 2008 实例上?

    是否可以将 SQL Server 2005 数据库的备份恢复到 SQL Server 2008 的实例上 我需要重建一台服务器 因为它变得相当糟糕 所以我计划借此机会升级到 SQL 2008 并想知道我是否能够正常恢复我的备份 从 2005
  • 插入 SQL Server 视图时使用 @@identity 或输出?

    请原谅我 我对 StackOverflow 和 SQL 都是新手 Tl dr 使用时 identity 或任何其他选项 例如scope identity或输出变量 是否也可以使用视图 这是一个使用存储过程的示例 identity SNIP
  • 在sql server中,sys.types中的user_type_id和system_type_id有什么区别

    sql server中sys types视图中的user type id和system type id有什么区别 我想将sys columns与sys types进行内连接以获取用户表中列的数据类型 但这两个视图都有两个字段user typ
  • 大型数据集的报告工具/查看器

    我有一个数据处理系统 可以根据其处理的数据生成非常大的报告 我所说的 大 是指该系统的 小 执行在转储到 CSV 文件中时会产生大约 30 MB 的报告数据 而大数据集大约为 130 150 MB 我确信有人有更大的想法 大 但这不是重点
  • SSRS报告不显示数据

    我刚刚创建了 SQL Server 2005 SSRS 报告 数据未显示在预览窗格中 数据集是根据字符串参数从存储过程正确填充的 我可以在数据窗格中执行它 在预览窗格中运行报表时 会显示正确的行数 但单元格的内容不包含任何数据 源数据集基于
  • 执行计划中是否考虑了功能?

    当查询在 SELECT 或 WHERE 子句中包含 PL SQL 函数 用户定义函数 时 如何生成执行计划 它是否也计算这些函数的成本并将其显示在执行计划中 或者这些函数只是被忽略 在此先感谢您的帮助 用户生成的函数在 SELECT 或 W
  • 我应该在删除数据之前禁用聚集索引吗?

    我知道这已经像任何事情一样被讨论过 但找不到我可以接受的可靠答案 假设我有一个有100亿条记录的表 需要删除where子句中带有标识列的记录 我应该选择哪个选项 选项1 禁用索引 这将节省删除后重新排列索引的开销 但会花费更长的时间来搜索需
  • 将记录与另一个表上的最新记录连接

    我正在尝试创建一个 SQL 视图 我如何从一个表中选择最新的记录 而其他记录保持原样 我需要从所有表中选择所有记录 这工作正常 但我需要仅按日期选择最新的提案 这是我遇到的问题 这是我到目前为止所拥有的 SELECT TOP 100 PER
  • 选择语句REF oracle

    我需要一些帮助来创建将使用引用的选择语句 我设法很好地插入了值 但是当我尝试使用 where 语句提取值时 输出要么是数据类型错误 要么会输出两个表以及它们都包含的数据 这只是一个例子 Create or replace table1 Ty
  • ssis将N个表从源服务器加载到目标服务器的最佳实践

    我需要将 N 个 大约 50 个 表从源数据库加载到目标数据库 每个表都与其他表不同 因此元数据不同 我想我可以使用父 pkg 来调用子 pkg 其中每个子 pkg 都有简单的结构 例如 DFT 来映射要导入的表 1 个子 pkg gt 1
  • SQL查询3个表,无法得到所需的结果

    列出所有已售出的作品以及艺术家 订购日期和发货日期 SELECT title artist order date ship date FROM items orders orderline WHERE orders order id ord
  • 如何从 tarantool 中选择有限数量的记录,就像 SQL 中的 SELECT LIMIT 一样?

    我想在 Tarantool 空间上执行选择 使用过滤和限制结果 就像我可以使用简单的 SQL 查询一样 SELECT FROM users WHERE age gt 33 LIMIT 1 我怎样才能做到这一点 可以使用 Lua 和 SQL
  • Oracle 函数编译成功,但在执行 PLS-00221 时抛出错误:不是过程或未定义

    我有简单的oracle功能 create or replace function abs test func test in in number return number is test out number BEGIN test out
  • 排除任何字段中具有 NULL 值的行结果?

    我有一个像这样的简单选择 SELECT FROM table WHERE fk id 10020 它可以工作 但有一些字段为 NULL 没有模式所以做了 SELECT FROM table WHERE fk id 10020 AND NOT
  • 如何在 Windows 7 - 64 位中安装 IBM db2 ODBC 驱动程序?

    我需要从本地 SQL Server 2008 R2 连接到远程 DB2 我不想使用链接服务器 因此 我正在搜索下载并尝试安装 IBM DB2 驱动程序 因为主机集成服务器附带的用于 DB2 的 Microsoft ODBC 驱动程序非常昂贵
  • MySQL 命令输出在命令行客户端中太宽[重复]

    这个问题在这里已经有答案了 我在用mysql终端模拟器中的命令行客户端lxterminal在Ubuntu中 当我运行以下命令时 mysql gt select from routines where routine name simplep

随机推荐