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前/后”不同的示例或文档吗?这对我来说似乎就像语法糖......
答案 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