oracle 为什么over()不返回null

tzxcd3kk  于 2023-06-22  发布在  Oracle
关注(0)|答案(2)|浏览(137)

如果over()意味着它的范围覆盖整个结果集,为什么它不会在“max(column)over()"中返回null。
为什么会有“null被认为是int”的概念?
OVER clause in Oracle
我试着找到官方的甲骨文文件。失败了。
尝试谷歌其他讨论得到一些线索。失败了。
我试着用不同的参数来测试自己,比如max(c)over(partition by c),max(c)over(order by c),以找出机制。失败

nwlls2ji

nwlls2ji1#

这在Oracle的“Aggregate Functions:
COUNT(*)GROUPINGGROUPING_ID之外的所有聚合函数都忽略null s。您可以在聚合函数的参数中使用NVL函数来替换null的值。COUNTREGR_COUNT从不返回null,而是返回数字或零。对于所有剩余的聚合函数,如果数据集不包含行,或者只包含以null s作为聚合函数参数的行,则该函数返回null
当您查看Analytic Functions的文档时,它指出:
分析函数基于一组行计算聚合值。它们与聚合函数的不同之处在于,它们为每个组返回多行。
因此,解析函数对于null值将遵循与其等效聚合版本完全相同的规则(并且将忽略null值,除非在那些记录的情况下);并且将在窗口上应用聚合并返回多个行。
例如,如果您有示例数据:

CREATE TABLE table_name (
  id          NUMBER GENERATED ALWAYS AS IDENTITY,
  column_name NUMBER
);
INSERT INTO table_name (column_name) VALUES (NULL);
INSERT INTO table_name (column_name) VALUES (NULL);

然后:

SELECT id, MAX(column_name) OVER () FROM table_name;

输出:
| ID| MAX(COLUMN_NAME)OVER()|
| - -----|- -----|
| 1|联系我们|
| 2|联系我们|
然后它输出null,因为数据集只包含以null s为参数的行(完全按照文档)。
如果添加非null行:

INSERT INTO table_name (column_name) VALUES (42);

然后:

SELECT id, MAX(column_name) OVER () FROM table_name;

输出:
| ID| MAX(COLUMN_NAME)OVER()|
| - -----|- -----|
| 1|四十二|
| 2|四十二|
| 3|四十二|
同样,正如文档所示,null值将被忽略,并返回非null行的最大值。
fiddle

aiazj4mn

aiazj4mn2#

我真的不明白你对null在over(partition by...)中的用法有什么期望。下面的示例说明了当您分区的列具有空值时,partition by是如何工作的:

with t_data (code, val) as (
  select 'A', 13 from dual union all
  select 'A', 8 from dual union all
  select 'A', 0 from dual union all
  select 'B', 121 from dual union all 
  select 'B', 441 from dual union all 
  select '', 7 from dual union all 
  select '', 21 from dual

)从t_data中选择code,瓦尔,max(val)over(partition by code);
结果应该足够清楚。如果这不能令人满意,请说明您希望达到的目标,并提供数据样本和预期结果。

相关问题