PostgreSQL:每个组获取第一个非空值

问题描述 投票:0回答:1

我有一张这样的桌子:

Category    Value
1           NULL
1           1922
2           23
2           99
3           NULL
3           NULL

我想获得的是每个类别的非空值首次出现。如果没有空值,则将显示NULL。这可能吗?

Category    Value
1           1922
2           23
3           NULL

谢谢您的帮助

postgresql partition
1个回答
0
投票

不幸的是,这两个琐碎的功能没有在PostgreSQL中实现

  • IGNORE NULLS中的[FIRST_VALUELAST_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)
© www.soinside.com 2019 - 2024. All rights reserved.