oracle 函数 挑战

fjmwish 2013-01-31 05:55:15
谁能 看懂 下面这段代码 很有 挑战性
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;
...全文
903 9 打赏 收藏 举报
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
fjmwish 2013-03-06
  • 打赏
  • 举报
回复
陈字文 2013-02-06
分析函数,貌似现在这个东西越来越火了,刚开始的时候确实觉着有点新奇。 分析函数大致适用于以下六种情况: ① 计算运行的总数 例如:逐行的显示一个部门的累计工资每行包括前面各行的工资总和。 ② 查找一组内的百分数 例如:显示在某些部门中付给个人的总工资的百分数,将他们的工资与该部门的工资总数相除。 ③ 前N个查询 例如:按照地区查找前N个工资最高的人或者前N份最高的销售款。 ④ 计算正在流动的平均值 例如:将当前行的值与当前N行的值加在一起计算平均数。 ⑤ 执行带等级的查询 例如:显示一个部门内一个人工资的相关等级。 引自:《oracle专家高级编程》,网上有电子版的可以下载,关于分析函数的那章节门槛非常低,适合学习
  • 打赏
  • 举报
回复
lovezxb0312 2013-02-06
with test as (select '用户1' as name ,'2011' as year from dual union all select '用户1' as name, '2012' as year from dual union all
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 不过楼主这个东东有点华而不实,测试了一下,结果并不理想,这才是我想要的结果!欢迎讨论!
  • 打赏
  • 举报
回复
lovezxb0312 2013-02-06
这个SQL有点小NB啊,目测他是想查出连续3年所有用户存在或使用情况,如果那一年没有就会缺失那个年份;请大家点评!
  • 打赏
  • 举报
回复
fjmwish 2013-02-04
那你就 写一个 我 觉得 不简单,向你请教了。
  • 打赏
  • 举报
回复
善若止水 2013-02-03
没看出有什么特别之处,我认为这就是简简单单的分析函数的用法。
  • 打赏
  • 举报
回复
fjmwish 2013-02-01
这是 数据库 中现有的数据 year  month amount 1991   1     1.1 1991   2     1.2 1991   3     1.3 1991   4     1.4 1992   1     2.1 1992   2     2.2 1992   3     2.3 1992   4     2.4 用这些分析函数(lead,over)写一个 sql 出来,这个 题很经典 year m1  m2  m3  m4 1991 1.1 1.2 1.3 1.4 1992 2.1 2.2 2.3 2.4
  • 打赏
  • 举报
回复
中间的lead(m,2) 应该是 lead(year, 2)吧。 另外,最后where rk=1,就只返回第一条了。 name b1 b2 a 2013-1-31 2013-1-31
  • 打赏
  • 举报
回复
raymonshi 2013-01-31
Lead() over()按照某种顺序将第下第n个位置的某一个字段值取出来,默认是往下1个位置, 楼主的这个sql,是先按照name分组,然后每组按照year排序,将下一行的year取出来。 name b1 b2 a 2013-1-31 2013-1-31 a 2013-1-31 2013-1-31 a 2013-1-31 2013-1-31 a 2013-1-31 b 2012-12-1 2012-12-2 b 2012-12-2 2012-12-3 b 2012-12-3 2012-12-4 b 2012-12-4
  • 打赏
  • 举报
回复
相关推荐
发帖
Oracle
加入

1.6w+

社区成员

Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
申请成为版主
帖子事件
创建了帖子
2013-01-31 05:55
社区公告
暂无公告