在稀疏表中选择一行第一个非空值

2024-02-12

使用下表:

A | B    | C    | ts
--+------+------+------------------
1 | null | null | 2016-06-15 10:00
4 | null | null | 2016-06-15 11:00 
4 |    9 | null | 2016-06-15 12:00
5 |    1 |    7 | 2016-06-15 13:00

如何在 N 行的运行窗口中选择每列的第一个非空值? “第一个”由列中时间戳的顺序定义ts。查询上表将得到:

A | B | C
--+---+---
1 | 9 | 7

窗口函数first_value() https://www.postgresql.org/docs/current/functions-window.html允许一个相当简短而优雅的解决方案:

SELECT first_value(a) OVER (ORDER BY a IS NULL, ts) AS a
     , first_value(b) OVER (ORDER BY b IS NULL, ts) AS b
     , first_value(c) OVER (ORDER BY c IS NULL, ts) AS c
FROM   t
LIMIT  1;

a IS NULL评估为TRUE or FALSE. FALSE排序在前TRUE。这样,非空值首先出现。订购依据ts(像你评论的时间戳列)接下来你就可以在一个单一的SELECT.

如果 Postgres 支持的话,这会更简单IGNORE NULLS. 手册: https://www.postgresql.org/docs/current/functions-window.html

SQL 标准定义了一个RESPECT NULLS or IGNORE NULLS选项lead, lag, first_value, last_value, and nth_value。这不是 在 PostgreSQL 中实现:行为始终与 标准的默认值,即RESPECT NULLS.

这是该领域标准 SQL 的少数遗漏之一。

我们也不能使用FILTER条款。看:

  • 使用附加(不同)过滤器聚合列 https://stackoverflow.com/questions/27136251/aggregate-columns-with-additional-distinct-filters/27141193#27141193

手册: https://www.postgresql.org/docs/current/sql-expressions.html#SYNTAX-WINDOW-FUNCTIONS

只有聚合的窗口函数才接受FILTER clause.

db<>fiddle
Old sqlfiddle http://sqlfiddle.com/#!17/dce83/1

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

在稀疏表中选择一行第一个非空值 的相关文章

随机推荐