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小提琴: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)
| 归档时间: |
|
| 查看次数: |
9092 次 |
| 最近记录: |