SQL select查询根据最接近的非空值填充空值

标签 sql snowflake-cloud-data-platform

我有下表(假设“名称”列按升序排列):

Name    Tag
'a'     200
'b'     400
'c'     null
'd'     null
'e'     null
'f'     100
'g'     null
'h'     null
'i'     null
'j'     500

我想在 Snowflake 中编写一个 SELECT 查询以返回具有最小最近值的空值,如下所示:

Name    Tag
'a'     200
'b'     400
'c'     400
'd'     400
'e'     400
'f'     100
'g'     100
'h'     100
'i'     100
'j'     500

如果我编写以下查询,它只会填充每个后续空组的第一个空值。

Select Name, coalesce(Tag, lag(Tag) over (order by Name)) as Tag

它返回:

Name    Tag
'a'     200
'b'     400
'c'     400
'd'     null
'e'     null
'f'     100
'g'     100
'h'     null
'i'     null
'j'     500

有什么想法吗?

最佳答案

Snowflake 支持IGNORE NULLS 子句:https://docs.snowflake.com/en/sql-reference/functions/lag.html

因此,您的查询将是:

Select Name, tag as tag_original, coalesce(Tag, lag(Tag) IGNORE NULLS over (order by Name)) as Tag from tags;

Oracle 还支持IGNORE NULLS:https://dbfiddle.uk/?rdbms=oracle_21&fiddle=d108ff84755240ec3b488aed08d80dc5

关于SQL select查询根据最接近的非空值填充空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73371665/

相关文章:

snowflake-cloud-data-platform - Snowflake 中的列绑定(bind)变量

snowflake-cloud-data-platform - Snowflake - 删除架构中的所有外键,可能使用 CTE 来删除

python - 使用 SQL SELECT 语句将 SQLite 数据库转换为 Python 字典

sql - 连接两个表并从它们中获取输出

mysql - 维护点表以减少行

sql - 使用时间戳差异将页面浏览量分组到 session 中

mysql - 修改MySql中通过group_Concat实现的值?

python - 属性错误 : 'SnowflakeCursor' object has no attribute 'cursor'

snowflake-cloud-data-platform - 如何在 Snowflake UI 中导出插入语句

python - 如何修复 Snowflake 数据库写入错误 : snowflake. Connector.errors.ProgrammingError) 001003 (42000)