是否存在可以在组内返回第一个非空值的聚合函数?

sup*_*sky 6 sql database oracle plsql oracle10g

我正在使用Oracle XE 10g.

请你仔细阅读我的问题.我有一个奇怪的用例,但请耐心等待.

假设我有以下记录:

Table person
Name  YearOfBirth
a     null
a     2001
a     2002
b     1990
b     null
c     null
c     2001
c     2009
Run Code Online (Sandbox Code Playgroud)

基本上如果我执行以下查询:

select
  p.Name, max(p.YearOfBirth)
from
  person p
group by
  p.Name
Run Code Online (Sandbox Code Playgroud)

这将为我提供具有不同名称的记录,并且每个不同的名称将与其组内的YearOfBirth的最大值配对.在给定的示例中,Name ='a'的组,最大YearOfBirth是2002.

如果max()是一个返回给定组中列的最大值的聚合函数,是否有一个函数返回该组中非空的第一个值而不是给我最大值,我想要你能找到的第一个值,只要它不是null.

请不要问我为什么我不能简单地使用min()或max()代替.

显然我不能在这里使用rownum,因为这样做会限制我可以获得的组数.

Ada*_*ger 10

我可能会误解为什么ROW NUMBER不适合你.我没有Oracle,但我在SQL Server中测试了这个,我相信它提供了您请求的结果:

WITH soTable AS
(
   SELECT 'a' AS Name, null AS YearOfBirth
   UNION ALL SELECT 'a', 2001
   UNION ALL SELECT 'a', 2002
   UNION ALL SELECT 'b', 1990
   UNION ALL SELECT 'b', null
   UNION ALL SELECT 'b', 1994
   UNION ALL SELECT 'b', 1981
   UNION ALL SELECT 'c', null
   UNION ALL SELECT 'c', 2009
   UNION ALL SELECT 'c', 2001
)
, soTableNoNulls AS
(
   SELECT so.Name, so.YearOfBirth, ROW_NUMBER() OVER (PARTITION BY so.Name ORDER BY so.Name ASC) AS RowNumber
   FROM soTable AS so
   WHERE so.YearOfBirth IS NOT NULL
)
SELECT nn.Name, nn.YearOfBirth
FROM soTableNoNulls AS nn
WHERE nn.RowNumber = 1
Run Code Online (Sandbox Code Playgroud)

  • 看起来您似乎没有使用soTableNoNulls中的RowNumber列。如果不需要,最好将其删除。我认为您可以将其减少到一个CTE,而不是两个。(不将CTE与测试数据一起计数。)(CTE =公用表表达式,在Oracle中通常称为子查询分解。) (2认同)