问题描述
我不明白为什么当使用最大或最小分析函数时,使用order by会改变结果-我希望所有的最大调用都有相同的结果,所有的最小调用都有相同的结果。
文档也没有给我任何理由相信它们会有所不同。
文档也没有给我任何理由相信它们会有所不同。
with td as (select 'X1' as grp1, to_date('09/03/2020 09:00:00','MM/DD/YYYY HH24:MI:SS') as stime, to_date('09/03/2020 10:59:59','MM/DD/YYYY HH24:MI:SS') as etime from dual union all select 'X1', to_date('09/03/2020 07:30:00','MM/DD/YYYY HH24:MI:SS'), to_date('09/03/2020 09:32:00','MM/DD/YYYY HH24:MI:SS') from dual union all select 'X1', to_date('09/03/2020 11:00:00','MM/DD/YYYY HH24:MI:SS'), to_date('09/03/2020 18:45:00','MM/DD/YYYY HH24:MI:SS') from dual) select td.*, max(td.etime) over (partition by td.grp1) as max_etime, max(td.etime) over (partition by td.grp1 order by td.stime asc) as max_etime_asc, max(td.etime) over (partition by td.grp1 order by td.stime desc) as max_etime_desc, min(td.etime) over (partition by td.grp1) as min_etime, min(td.etime) over (partition by td.grp1 order by td.stime asc) as min_etime_asc, min(td.etime) over (partition by td.grp1 order by td.stime desc) as min_etime_desc from td复制
GR STIME ETIME MAX_ETIME MAX_ETIME_ASC MAX_ETIME_DESC MIN_ETIME MIN_ETIME_ASC MIN_ETIME_DESC -- ------------------- ------------------- ------------------- ------------------- ------------------- ------------------- ------------------- ------------------- X1 09/03/2020 07:30:00 09/03/2020 09:32:00 09/03/2020 18:45:00 09/03/2020 09:32:00 09/03/2020 18:45:00 09/03/2020 09:32:00 09/03/2020 09:32:00 09/03/2020 09:32:00 X1 09/03/2020 09:00:00 09/03/2020 10:59:59 09/03/2020 18:45:00 09/03/2020 10:59:59 09/03/2020 18:45:00 09/03/2020 09:32:00 09/03/2020 09:32:00 09/03/2020 10:59:59 X1 09/03/2020 11:00:00 09/03/2020 18:45:00 09/03/2020 18:45:00 09/03/2020 18:45:00 09/03/2020 18:45:00 09/03/2020 09:32:00 09/03/2020 09:32:00 09/03/2020 18:45:00复制
专家解答
当您在 “过度” 子句中有order by时,默认窗口子句为:
这意味着:
计算从数据设置开始到与当前行具有相同值的所有行的函数。所以任何值在当前之后的行都是excluded从计算。
因此,预计min/max的值可以在您处理数据集时更改。
如果要获得整个分区的最小值/最大值,请删除顺序。
或者您可以在排序后添加此窗口:
我想不出一个很好的理由来做到最小/最大。这是很多额外的代码,以获得与单独分区相同的效果。
range between unbounded preceding and current row复制
这意味着:
计算从数据设置开始到与当前行具有相同值的所有行的函数。所以任何值在当前之后的行都是excluded从计算。
因此,预计min/max的值可以在您处理数据集时更改。
如果要获得整个分区的最小值/最大值,请删除顺序。
或者您可以在排序后添加此窗口:
rows between unbounded preceding and unbounded following复制
我想不出一个很好的理由来做到最小/最大。这是很多额外的代码,以获得与单独分区相同的效果。
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
Oracle DataGuard高可用性解决方案详解
孙莹
589次阅读
2025-03-26 23:27:33
Oracle RAC 一键安装翻车?手把手教你如何排错!
Lucifer三思而后行
542次阅读
2025-04-15 17:24:06
【纯干货】Oracle 19C RU 19.27 发布,如何快速升级和安装?
Lucifer三思而后行
456次阅读
2025-04-18 14:18:38
Oracle SQL 执行计划分析与优化指南
Digital Observer
442次阅读
2025-04-01 11:08:44
XTTS跨版本迁移升级方案(11g to 19c RAC for Linux)
zwtian
439次阅读
2025-04-08 09:12:48
【ORACLE】记录一些ORACLE的merge into语句的BUG
DarkAthena
437次阅读
2025-04-22 00:20:37
墨天轮个人数说知识点合集
JiekeXu
436次阅读
2025-04-01 15:56:03
【ORACLE】你以为的真的是你以为的么?--ORA-38104: Columns referenced in the ON Clause cannot be updated
DarkAthena
411次阅读
2025-04-22 00:13:51
Oracle数据库一键巡检并生成HTML结果,免费脚本速来下载!
陈举超
402次阅读
2025-04-20 10:07:02
Oracle 19c RAC更换IP实战,运维必看!
szrsu
390次阅读
2025-04-08 23:57:08