17,136
社区成员
发帖
与我相关
我的任务
分享谁能 看懂 下面这段代码 很有 挑战性select * from (select name, year b1, lead(year) over(partition by name order by year) b2, lead(m,2) over(partition by name order by year) b3,rank()over(partition by name order by year) rk from t) where rk=1;
分析函数,貌似现在这个东西越来越火了,刚开始的时候确实觉着有点新奇。
分析函数大致适用于以下六种情况:
① 计算运行的总数
例如:逐行的显示一个部门的累计工资每行包括前面各行的工资总和。
② 查找一组内的百分数
例如:显示在某些部门中付给个人的总工资的百分数,将他们的工资与该部门的工资总数相除。
③ 前N个查询
例如:按照地区查找前N个工资最高的人或者前N份最高的销售款。
④ 计算正在流动的平均值
例如:将当前行的值与当前N行的值加在一起计算平均数。
⑤ 执行带等级的查询
例如:显示一个部门内一个人工资的相关等级。
引自:《oracle专家高级编程》,网上有电子版的可以下载,关于分析函数的那章节门槛非常低,适合学习
select '用户1' as name, '2013' as year from dual
union all
select '用户2' as name,'2011' as year from dual
union all
select '用户2' as name, '2012' as year from dual
union all
select '用户2' as name, '2013' as year from dual
union all
select '用户3' as name ,'2012' as year from dual
union all
select '用户3' as name, '2013' as year from dual
)
select name,
sum(case when year=to_char(add_months(sysdate,-24),'yyyy') then year else null end) b1,
sum(case when year=to_char(add_months(sysdate,-12),'yyyy') then year else null end) b2,
sum(case when year=to_char(sysdate,'yyyy') then year else null end) b3
from test
group by name
order by name
不过楼主这个东东有点华而不实,测试了一下,结果并不理想,这才是我想要的结果!欢迎讨论!