如果over()意味着它的范围覆盖整个结果集,为什么它不会在“max(column)over()"中返回null。
为什么会有“null被认为是int”的概念?
OVER clause in Oracle
我试着找到官方的甲骨文文件。失败了。
尝试谷歌其他讨论得到一些线索。失败了。
我试着用不同的参数来测试自己,比如max(c)over(partition by c),max(c)over(order by c),以找出机制。失败
如果over()意味着它的范围覆盖整个结果集,为什么它不会在“max(column)over()"中返回null。
为什么会有“null被认为是int”的概念?
OVER clause in Oracle
我试着找到官方的甲骨文文件。失败了。
尝试谷歌其他讨论得到一些线索。失败了。
我试着用不同的参数来测试自己,比如max(c)over(partition by c),max(c)over(order by c),以找出机制。失败
2条答案
按热度按时间nwlls2ji1#
这在Oracle的“Aggregate Functions:
除
COUNT(*)
、GROUPING
和GROUPING_ID
之外的所有聚合函数都忽略null
s。您可以在聚合函数的参数中使用NVL
函数来替换null
的值。COUNT
和REGR_COUNT
从不返回null
,而是返回数字或零。对于所有剩余的聚合函数,如果数据集不包含行,或者只包含以null
s作为聚合函数参数的行,则该函数返回null
。当您查看Analytic Functions的文档时,它指出:
分析函数基于一组行计算聚合值。它们与聚合函数的不同之处在于,它们为每个组返回多行。
因此,解析函数对于
null
值将遵循与其等效聚合版本完全相同的规则(并且将忽略null
值,除非在那些记录的情况下);并且将在窗口上应用聚合并返回多个行。例如,如果您有示例数据:
然后:
输出:
| ID| MAX(COLUMN_NAME)OVER()|
| - -----|- -----|
| 1|联系我们|
| 2|联系我们|
然后它输出
null
,因为数据集只包含以null
s为参数的行(完全按照文档)。如果添加非
null
行:然后:
输出:
| ID| MAX(COLUMN_NAME)OVER()|
| - -----|- -----|
| 1|四十二|
| 2|四十二|
| 3|四十二|
同样,正如文档所示,
null
值将被忽略,并返回非null
行的最大值。fiddle
aiazj4mn2#
我真的不明白你对null在over(partition by...)中的用法有什么期望。下面的示例说明了当您分区的列具有空值时,partition by是如何工作的:
)从t_data中选择code,瓦尔,max(val)over(partition by code);
结果应该足够清楚。如果这不能令人满意,请说明您希望达到的目标,并提供数据样本和预期结果。