【发布时间】:2011-12-09 00:10:04
【问题描述】:
我正在使用 Oracle XE 10g。
请您仔细阅读我的问题。我有一个奇怪的用例,但请耐心等待。
假设我有以下记录:
Table person
Name YearOfBirth
a null
a 2001
a 2002
b 1990
b null
c null
c 2001
c 2009
基本上,如果我执行以下查询:
select
p.Name, max(p.YearOfBirth)
from
person p
group by
p.Name
这将为我提供具有不同名称的记录,并且每个不同的名称将与其组中 YearOfBirth 的最大值配对。在给定示例中,Name='a' 的组中,YearOfBirth 的最大值为 2002。
如果 max() 是返回给定组中列的最大值的聚合函数,是否有返回组中的第一个值不为空的函数? 我想要的不是最大值,而是你能找到的第一个值,只要它不为空即可。
请不要问我为什么不能简单地使用 min() 或 max()。
显然我不能像某些人建议的那样在这里使用 rownum,因为这样做会限制我可以获得的组数。
【问题讨论】:
-
如何定义“第一”?除非您的表是 IOT(索引组织表)或您正在处理从带有“ORDER BY”的 SELECT 返回的行,否则表中的行没有定义的顺序。
-
请先定义。表中的数据是无序的,返回结果的顺序可能随时改变。仅当可以根据数据进行定义时,首先的概念才有意义。
-
@George3:即使在 IOT 中,也没有定义的顺序,并且有可能返回不按主键顺序排列的结果,尤其是在快速全扫描主键索引的情况下被执行。见:asktom.oracle.com/pls/apex/…
-
@Shannon Severance - 在 IOT 中没有为 retrieval 定义的顺序,仅按主键定义的逻辑存储顺序排列。
-
@Shannon 是的,我知道没有检索“第一”行的“规范”是没有意义的,或者没有明确定义“第一”是没有意义的”。但这就是重点,解决方案本身应该没有获得第一个的基础。这正是“规范”。我知道这没有意义,但到底是什么,这是一个很长的故事。以前从未有过这种用例。
标签: sql database oracle plsql oracle10g