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

Ale*_*x B 11 sql postgresql null window-functions

使用下表,

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
Run Code Online (Sandbox Code Playgroud)

如何在N行的运行窗口中选择每列的第一个非空值?例如,查询上表将导致:

A | B | C
--+---+---
1 | 9 | 7
Run Code Online (Sandbox Code Playgroud)

Erw*_*ter 18

窗口功能first_value()允许一个相当简短和优雅的解决方案:

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;
Run Code Online (Sandbox Code Playgroud)

a IS NULL评估为TRUE/ FALSE.FALSE(TRUE)在ts(SELECT)之前排序.这样,非空值首先出现.IGNORE NULLS接下来按顺序排列(如你所评论的时间戳列),你就可以在一个单一的中找到它RESPECT NULLS.

SQL小提琴.


pet*_*rov 0

不确定我是否正确回答了这个问题,
因为它看起来基本上很简单。
尝试这个查询。

SQL小提琴:http://sqlfiddle.com/#!11/ac585 /8

WITH t0 AS
(
    SELECT A FROM
    TableName t0
    WHERE (A IS NOT NULL)
    ORDER BY ID ASC
    LIMIT 1
),

t1 AS
(
    SELECT B FROM
    TableName
    WHERE (B IS NOT NULL)
    ORDER BY ID ASC
    LIMIT 1
),

t2 AS

(
    SELECT C FROM
    TableName
    WHERE (C IS NOT NULL)
    ORDER BY ID ASC
    LIMIT 1
)

SELECT t0.A, t1.B, t2.C
FROM
t0
JOIN t1 ON 1=1
JOIN t2 ON 1=1
Run Code Online (Sandbox Code Playgroud)