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