楼主: fuzhangpeng

[讨论] puber们,谈谈oracle开发的面试题

[复制链接]
论坛徽章:
5
灰彻蛋
日期:2012-11-13 19:31:45本田
日期:2013-08-05 14:05:06阿斯顿马丁
日期:2013-11-06 17:46:58问答徽章
日期:2013-11-12 17:32:10保时捷
日期:2013-12-02 17:18:42
11#
发表于 2015-3-11 15:30 | 只看该作者
1.
   不知道如果不止一个应该怎么显示。。是多行?多列?还是一个列拼起来?
select dep,max(sal),min(sal),
case when count(emp_name) KEEP(DENSE_RANK first ORDER BY sal) =1 then min(emp_name) KEEP(DENSE_RANK first ORDER BY sal)  else .. end
from emp1
group by dep

   2.
这个是按部门分行打印,不知道是不是需求的意思。。。
又或者是5个一行,无序打印?
select
max(case when rn=1 then EMP_NAME else null end),
max(case when rn=2 then EMP_NAME else null end) ,
max(case when rn=3 then EMP_NAME else null end ),
max(case when rn=4 then EMP_NAME else null end),
max(case when rn=5 then EMP_NAME else null end)  
from
(  select t.* ,row_number()over(partition by dep order by sal) rn
from emp1 t
)
group by dep

使用道具 举报

回复
论坛徽章:
2
优秀写手
日期:2014-08-22 06:00:03慢羊羊
日期:2015-03-11 16:58:50
12#
 楼主| 发表于 2015-3-11 15:31 | 只看该作者
第一题答案和3#的差不多。。
select  deptno 部门编号,
min(sal) 最小工资,
wmsys.wm_concat(ename)  keep(dense_rank first order by sal)最小工资的员工,
max(sal) 最大工资,
wmsys.wm_concat(ename)  keep(dense_rank last order by sal)最大工资的员工
from emp
group by deptno;

使用道具 举报

回复
论坛徽章:
2
优秀写手
日期:2014-08-22 06:00:03慢羊羊
日期:2015-03-11 16:58:50
13#
 楼主| 发表于 2015-3-11 15:33 | 只看该作者
第二题更简单:
select * from (
        Select ename, rn, row_number() over(Partition By rn Order By ename) rn2
        From   (Select ename, ceil(rn / 5) rn
                    From   (Select ename, rownum As rn From emp)
                  )
)pivot(
max(ename) for rn2 in (1,2,3,4,5)
);

使用道具 举报

回复
论坛徽章:
40
2014年新春福章
日期:2014-02-18 16:43:09喜羊羊
日期:2015-05-18 16:24:25慢羊羊
日期:2015-06-12 13:08:22暖羊羊
日期:2015-07-02 16:06:20暖羊羊
日期:2015-07-06 16:28:55狮子座
日期:2015-07-29 17:14:43摩羯座
日期:2015-09-02 13:58:47白羊座
日期:2015-09-08 10:39:06天枰座
日期:2015-09-17 21:41:53摩羯座
日期:2015-10-29 21:07:02
14#
发表于 2015-3-11 15:36 | 只看该作者
交流一下:
1、
SELECT NAME,salary FROM (
SELECT RANK() OVER(ORDER BY salary) low,rank() over(ORDER BY salary desc) high,a.* FROM emp a)
WHERE low=1 OR HIGH=1;

2、
SELECT listagg(name,'   ') WITHIN GROUP (ORDER BY name)
FROM (
SELECT name,CEIL(ROWNUM/5) gr FROM emp)
GROUP BY gr;

使用道具 举报

回复
论坛徽章:
2
暖羊羊
日期:2015-03-04 14:54:572015年新春福章
日期:2015-03-06 11:59:47
15#
发表于 2015-3-11 15:43 | 只看该作者
--第一题:
with a as (
      select 1000 salary, 'a' name from dual
      union all
      select 2000 , 'b' from dual
      union all
      select 3000 , 'c' from dual
)
select
      a.*,
      max(salary) over () mx,
        min(salary) over() mi,
        first_value(name) over (order by salary desc) mx_name,
        first_value(name) over (order by salary asc ) mi_name      
  from a;

使用道具 举报

回复
论坛徽章:
2
优秀写手
日期:2014-08-22 06:00:03慢羊羊
日期:2015-03-11 16:58:50
16#
 楼主| 发表于 2015-3-11 15:46 | 只看该作者
bfc99 发表于 2015-3-11 15:36
交流一下:
1、
SELECT NAME,salary FROM (

第二题的思路学习了。。
第一题没分组考虑,我补了一下

Select deptno,
       ename,
       sal,
       Case
           When low = 1 Then
            'MIN'
           When high = 1 Then
            'MAX'
       End SALN
From   (Select rank() over(Partition By deptno Order By sal) low,
               rank() over(Partition By deptno Order By sal Desc) high,
               a.*
        From   emp a)
Where  low = 1
       Or high = 1;

使用道具 举报

回复
论坛徽章:
2
暖羊羊
日期:2015-03-04 14:54:572015年新春福章
日期:2015-03-06 11:59:47
17#
发表于 2015-3-11 15:50 | 只看该作者
本帖最后由 ora_pascal1982 于 2015-3-11 15:51 编辑
ora_pascal1982 发表于 2015-3-11 15:43
--第一题:
with a as (
      select 1000 salary, 'a' name from dual
select
        emp.*,
        max(sal ) over (partition by deptno ) mx,
        min(sal) over (partition by deptno ) mi,
        first_value(ename) over (partition by deptno order by sal desc ) mx_name,
        first_value(ename) over (partition by deptno order by sal asc ) mi_name
  from emp;

1        20        3000        800        FORD        SMITH
2        10        5000        1300        KING        MILLER
3        30        2850        950        BLAKE        JAMES


使用道具 举报

回复
论坛徽章:
2
优秀写手
日期:2014-08-22 06:00:03慢羊羊
日期:2015-03-11 16:58:50
18#
 楼主| 发表于 2015-3-11 15:55 | 只看该作者
ora_pascal1982 发表于 2015-3-11 15:50
select
        emp.*,
        max(sal ) over (partition by deptno ) mx,

没考虑重复值的问题吧?比如20部门就有两个最大值

使用道具 举报

回复
论坛徽章:
2
暖羊羊
日期:2015-03-04 14:54:572015年新春福章
日期:2015-03-06 11:59:47
19#
发表于 2015-3-11 15:58 | 只看该作者
fuzhangpeng 发表于 2015-3-11 15:55
没考虑重复值的问题吧?比如20部门就有两个最大值

疏忽了

使用道具 举报

回复
论坛徽章:
2
优秀写手
日期:2014-08-22 06:00:03慢羊羊
日期:2015-03-11 16:58:50
20#
 楼主| 发表于 2015-3-11 15:59 | 只看该作者
分享一下你们遇到的面试题呢。。。。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表