一个复杂的排名问题

qq_40608182 2017-11-20 10:26:08
存在一个雇员employee 表,创建该表的语句如下:
create table employee(emp_id number(3), emp_name varchar2(20), salary number(10,2));
该表的查询结果如下:
select emp_id, emp_name, salary from employee;
emp_id emp_name salary
-------- ------------------------------------------------------------------------------------
1 关羽 4632
2 张飞 4632
3 刘备 4932
4 赵云 5832
5 黄忠 4932
6 马超 5832
7 孔明 6632
8 姜维 4932
9 吕布 6432
请创建一个PL/SQL 存储过程,它确定employee表中薪水排名在前5个名次的雇员,输出显示这些雇员的名次,姓名,薪水。如果有雇员薪水相同,它们显示在同一行,用分号分隔; 如果某个名次的雇员为n(n大于等于2)个, 则下n-1个名次的雇员空缺。 显示结果示例如下:
1.孔明, 6632
2.吕布, 6432
3.赵云, 5832; 马超, 5832
4.
5.刘备, 4932; 黄忠, 4932; 姜维, 4932

这个需求用PLSQL怎么写呢?
...全文
174 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_40608182 2017-11-21
  • 打赏
  • 举报
回复
引用 1 楼 qq646748739 的回复:
试试这个:

--1.创建测试表:
create table tmp(emp_id number(3), emp_name varchar2(20), salary number(10,2));
insert into tmp values(1,'关羽',4632);
insert into tmp values(2,'张飞',4632);
insert into tmp values(3,'刘备',4932);
insert into tmp values(4,'赵云',5832);
insert into tmp values(5,'黄忠',4932);
insert into tmp values(6,'马超',5832);
insert into tmp values(7,'孔明',6632);
insert into tmp values(8,'姜维',4932);
insert into tmp values(9,'吕布',6432); 

--2.SQL实现:
--方法1:
select replace(wmsys.wm_concat(ls), ',', ';'),rn 
 from(select emp_name ||','||salary ls,rn 
       from(select emp_id,emp_name,salary,rank() over(order by salary desc) rn from tmp)
	 );

--方法2:
select emp_id, max(substr(sys_connect_by_path(col, ';'), 2)) str
  from (select emp_id,emp_name||','||salary as col,row_number()over(partition by emp_id order by emp_name) rn 
          from (select emp_name,salary,dense_rank() over( order by salary desc) as emp_id 
		          from emp
               ) 
         where emp_id < 6
        )
  start with rn = 1
connect by rn = prior rn + 1
    and emp_id = prior emp_id
  group by emp_id;
运行了下,可以使用,非常感谢!
碧水幽幽泉 2017-11-20
  • 打赏
  • 举报
回复
试试这个:

--1.创建测试表:
create table tmp(emp_id number(3), emp_name varchar2(20), salary number(10,2));
insert into tmp values(1,'关羽',4632);
insert into tmp values(2,'张飞',4632);
insert into tmp values(3,'刘备',4932);
insert into tmp values(4,'赵云',5832);
insert into tmp values(5,'黄忠',4932);
insert into tmp values(6,'马超',5832);
insert into tmp values(7,'孔明',6632);
insert into tmp values(8,'姜维',4932);
insert into tmp values(9,'吕布',6432); 

--2.SQL实现:
--方法1:
select replace(wmsys.wm_concat(ls), ',', ';'),rn 
 from(select emp_name ||','||salary ls,rn 
       from(select emp_id,emp_name,salary,rank() over(order by salary desc) rn from tmp)
	 );

--方法2:
select emp_id, max(substr(sys_connect_by_path(col, ';'), 2)) str
  from (select emp_id,emp_name||','||salary as col,row_number()over(partition by emp_id order by emp_name) rn 
          from (select emp_name,salary,dense_rank() over( order by salary desc) as emp_id 
		          from emp
               ) 
         where emp_id < 6
        )
  start with rn = 1
connect by rn = prior rn + 1
    and emp_id = prior emp_id
  group by emp_id;
内容概要:本文围绕基于两阶段鲁棒优化算法的微网多电源容量配置问题展开研究,针对微电网中风能、光伏、柴油发电机及储能系统等多元电源的容量规划难题,提出了一种能够有效应对源荷不确定性的优化方法。该方法采用两阶段鲁棒优化框架,第一阶段确定电源的最优配置容量,第二阶段通过调整运行策略应对不确定性扰动,从而提升系统在复杂环境下的适应性与经济性。文中结合Matlab实现了完整的算法建模与仿真验证,提供了清晰的代码实现路径,展示了模型在典型场景下的求解过程与结果分析,具有较强的工程应用价值。; 适合人群:具备一定电力系统基础知识和Matlab编程能力,从事新能源、微电网、优化调度等相关领域的科研人员及研究生。; 使用场景及目标:①解决含高比例可再生能源的微电网系统中电源容量配置的鲁棒性问题;②掌握两阶段鲁棒优化建模方法及其在能源系统中的实际应用;③为应对源荷不确定性提供可复现的技术方案与仿真工具支持; 阅读建议:此资源侧重于算法建模与实际仿真相结合,建议读者在理解鲁棒优化基本理论的基础上,结合Matlab代码逐模块分析,重点掌握不确定集构建、列与约束生成(C&CG)算法实现以及运行结果的经济性与可靠性评估方法,以实现从理论到实践的贯通。

17,136

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧