我有一张这样的桌子:
Category Value
1 NULL
1 1922
2 23
2 99
3 NULL
3 NULL
我想要获得的是每个类别的非空值首次出现。如果没有空值,则将显示NULL。这可能吗?
Category Value
1 1922
2 23
3 NULL
感谢您的帮助
答案 0 :(得分:5)
不幸的是,这两个琐碎的功能并未在postgresql中实现
IGNORE NULLS
,FIRST_VALUE
LAST_VALUE
子句但是,您可以使用不支持FILTER子句的groupby&array_agg hack 获得所需的结果,然后使用方括号语法选择第一个元素。 (回想一下,PostgreSQL数组索引从1开始)
此外,我建议您为聚合步骤提供明确的顺序。否则,最终作为第一个元素的值将取决于基础表的查询计划和物理数据布局。
FILTER
产生以下输出:
WITH vals (category, val) AS ( VALUES
(1,NULL),
(1,1922),
(2,23),
(2,99),
(3,NULL),
(3,NULL)
)
SELECT
category
, (ARRAY_AGG(val) FILTER (WHERE val IS NOT NULL))[1]
FROM vals
GROUP BY 1