sql—oracle如何使用order by子句计算运行总数?

raogr8fs  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(452)

在试图理解sql如何仅使用“orderby”子句而不使用其他语句来计算运行总数时,我感到非常困惑。查询中没有发生计数器或增量。有人能帮我理解它在数据层面的工作细节吗?
我的查询用于计算运行总数:

select ename, sal, sum(sal) over (order by sal) from emp;

ORDERBY子句如何跟踪前一行并在其上添加值?

de90aj5v

de90aj5v1#

sql是一种描述性语言,而不是过程性语言。这意味着查询描述正在生成的结果集。它没有指定具体的逐步实现方法。
编译器和优化器将查询转换为可执行代码——通常是一个有向的、非循环的操作图。您可以通过调查查询的解释计划来了解这一点。
您的问题的简单答案是,sql的设计者选择了您提到的语法作为条件和的语法。oracle已经实现了这种语法。如何实现它由编译器和优化器决定。
更复杂的答案是oracle有多种算法来进行计算。例如,有时累积和可以利用索引。有时候不行。

k75qkfdt

k75qkfdt2#

因为这个

select ename, 
       sal, 
       sum(sal) over (order by sal) 
from emp

是的缩写

select ename, 
       sal, 
       sum(sal) over (order by sal) RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
from emp

根据sql标准和此处的文档:
如果您完全省略windowing\子句,那么缺省值是介于无界的前一行和当前行之间的范围。
https://docs.oracle.com/database/121/sqlrf/functions004.htm#sqlrf06174

snz8szmq

snz8szmq3#

我很感激你渴望了解它的功能。首先你需要了解聚合函数和解析函数的基本概念。下面的例子可能会给你一个公平的想法。我把员工带到table上,

如果您看到分析函数,row\u number->its为每一行指定一个唯一的值,当您对be salary进行排序时,它会按您排序的顺序提供行号
rank->rank为每次出现的值指定相同的值。例:6500是两次的,你的同一个等级被分配给两行,因为它的两次,第三等级将是船长,第四等级将被分配给下一个值
密集等级-->与等级类似,但不会跳过分配给它的等级值。
现在来回答你的问题。聚合函数和分析函数都应用于列。您可以检查秩或稠密秩结果,并将其与您使用的函数进行比较,sum(sal)over(order by sal),您对秩的每个阶段的值进行求和,因此,在每个级别的秩中,将值与您以前的值进行求和。

相关问题