lag表示 分组排序后 ,组内后面一条记录减前面一条记录的差,第一条可返回 NULL ;lag(arg1,arg2,arg3):
arg1是从其他行返回的表达式
arg2是希望检索的当前行分区的偏移量。是一个正的偏移量,时一个往回检索以前的行的数目。
arg3是在arg2表示的数目超出了分组的范围时返回的值。
sql over的作用及用法
RANK ( ) OVER ( [query_partition_clause] order_by_clause )
DENSE_RANK ( ) OVER ( [query_partition_clause] order_by_clause )
可实现按指定的字段分组排序,对于相同分组字段的结果集进行排序,
其中PARTITION BY 为分组字段,ORDER BY 指定排序字段
over不能单独使用,要和分析函数:rank(),dense_rank(),row_number()等一起使用。
其参数:over(partition by columnname1 order by columnname2)
含义:按columname1指定的字段进行分组排序,或者说按字段columnname1的值进行分组排序。
例如:employees表中,有两个部门的记录:department_id =10和20
select department_id,rank() over(partition by department_id order by salary) from employees就是指在部门10中进行薪水的排名,在部门20中进行薪水排名。如果是partition by org_id,则是在整个公司内进行排名。
对于支持分析函数lag的数据库(oracle 9i或之后, sql server 2012开始有支持lag, lead分析函数; postgresql和mysql不知道)来说, 可以直接使用lag函数. lag分析函数的作
Lag()就是取当前顺序的上一行记录。结合over就是分组统计数据的。
Lag()函数,就是去上N行的字段的数据。
with tmp as(
select '1' id ,'aa' name from dual union all
select '2' id ,'bb' name from dual
)
select a.*,
lag(name,1) over (order by id desc) lag
from tmp a
运行结果:
ENAME SAL PREV_ENAME PREV_SAL
---------- ---------- ---------- ----------
SMITH 800 N/A
JAMES 950 SMITH 800
ADAMS 1100 JAMES 950
WARD 1250 ADAMS 1100
MARTIN 1250 WARD 1250
MILLER 1300 MARTIN 1250
TURNER 1500 MILLER 1300
ALLEN 1600 TURNER 1500
CLARK 2450 ALLEN 1600
BLAKE 2850 CLARK 2450
JONES 2975 BLAKE 2850
用户登录
还没有账号?立即注册
用户注册
投稿取消
文章分类: |
|
还能输入300字
上传中....