Oracle分析函数的窗口子句中“当前行”和“0前/后”之间的任何区别?

时间:2008-12-18 23:07:03

标签: sql oracle analytics

Oracle的一些分析函数允许windowing clause指定当前分区的子集,使用“无界前/后”,“当前行”或“value_expr before / following”等关键字,其中value_expr为与当前行或值的物理或逻辑偏移量(取决于您是否分别指定了ROW或RANGE)。

以下是使用scott / tiger显示部门30中员工的示例,以及他们之前雇用的部门员工人数(包括他们自己):

select deptno, 
       empno,
       hiredate,
       count(*) over (partition by deptno 
                          order by hiredate
                          range between unbounded preceding and current row) cnt_hired_before1,
       count(*) over (partition by deptno 
                          order by hiredate
                          range between unbounded preceding and 0 preceding) cnt_hired_before2
  from emp
 where deptno = 30
 order by deptno, hiredate;

...任何人都可以提供“当前行”与“0前/后”不同的示例或文档吗?这对我来说似乎就像语法糖......

3 个答案:

答案 0 :(得分:2)

使用哪个并不重要。它们是表达窗口的两种不同方式,但优化器将以相同的方式执行查询。术语“当前行”是具有分析功能的多个数据库所共有的,而不仅仅是Oracle。这更像是一种风格差异,就像有些人更喜欢count(*)而不是count(1)。

答案 1 :(得分:1)

我必须提供的Oracle文档(Oracle 9.2)说:

  

如果您指定了RANGE:

     
      
  • value_expr是逻辑偏移量。它必须是常量或表达式   评估为正数值   或间隔文字。
  •   

这意味着您不应该使用0,因为它不是正数值。但是,显然可以在你之前使用0之前/之后。

答案 2 :(得分:-1)

关于你想要完成的事情。 您可能希望使用RANGE BETWEEN / ROWS BETWEEN使用它在子集中查找LAST_VALUE或比较子集内的事物。但是你肯定不需要你提供的例子。

    select deptno, 
       empno,
       hiredate,
       count(*) over (partition by deptno, trunc(hiredate,'mm')) cnt_same_month
  from emp
 where deptno = 30
 order by deptno, hiredate