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