分组查询取得前几名的sql语句编写--我给自己的命题
来源:互联网 发布:淘宝发布宝贝图片模板 编辑:程序博客网 时间:2024/05/02 01:32
这个问题是我给自己提出的的一个问题,以验证sql语言是否“无所不能”,经过很久的思考和酝酿,现在终于有个几个答案,现在记录在blog中。
命题:选取每个部门中年龄前两名的人员姓名和年龄。
答案一:
select * from (
select * from
(select * from scott.empb minus select * from scott.empb a where num=(select max(num) from scott.empb b where a.dept=b.dept)) a
where num=(select max(num) from (select * from scott.empb minus select * from scott.empb a where num=(select max(num) from scott.empb b where a.dept=b.dept))
b where a.dept=b.dept)
union
select * from scott.empb a where num=(select max(num) from scott.empb b where a.dept=b.dept)
) order by dept,num desc
------这个是技巧的迭代,思路是“找出部门年龄最大的人做表A,在人员empb表中剔除这些人,剩下的人找出年龄最大的人,然后union上表A.问题解决”
答案二:
begin
for cc in (select distinct dept from scott.empb) loop
for aa in (select * from (select * from scott.empb where dept=cc.dept order by num desc) a where rownum <3) loop
dbms_output.put_line(aa.id||','||aa.name||','||aa.dept||','||aa.num);
end loop;
end loop;
end;
/
-----主要技巧是,先取一个部门,找出年纪最老的前两人,在取一个部门,找出前两人,知道无部门可取,循环结束。
答案三: 此方法是老杨提供的
利用oracle8.1.6开始支持的“分析函数”,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是对于每个组返回多行,而聚合函数对于每个组只返回一行。
select * from (select id,name,dept,num, count(*) OVER(PARTITION BY a.dept ORDER BY a.num desc) aa from scott.empb a)
where aa<3
是否还有别的方法我不确定,不过我会继续思考,一有所得会在此补充
- 分组查询取得前几名的sql语句编写--我给自己的命题
- 按周分组查询的SQL语句
- 按周分组查询的SQL语句
- Sqlserver 动态sql查询语句的编写
- 分组查询SQL语句
- sql语句分组查询
- sql分组查询语句
- 多条件查询 分组 分页的sql语句
- 用SQL 语句查询 用户自己编写的 存储过程(Stored Procedure) & count 方法的奇怪之处
- SQL查询案例:取得分组 TOP-N
- SQL查询案例:取得分组 TOP-N
- oracle 嵌套查询(给我自己看的)
- 自己总结的不定条件SQL查询语句的写法
- [MS SQL]SQL语句查询每个分组的前N条记录的实现方法
- 编写查询条件不区分大小写的SQL语句!
- 怎么把 sql语句查询的值赋给变量
- 给查询出的SQL语句加序号
- 非常有意思的SQL查询语句(自己认为)
- 莘县话
- 纯纯的课本C++练习
- 深入浅出C# 中文版 图文皆译 第三章 page94
- 小巧精悍的引导程序--Blob
- (冒泡算法)练习
- 分组查询取得前几名的sql语句编写--我给自己的命题
- 以树形格式罗列文件
- 中断的作用
- spring IOC
- 这样的程序员创业有戏
- 902
- SQL 学习心得之四
- j2me难啃问题
- 真正的 妹控宣言