重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
select c1.departid 部门,
创新互联建站专业为企业提供承德网站建设、承德做网站、承德网站设计、承德网站制作等企业网站建设、网页设计与制作、承德企业网站模板建站服务,10年承德做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
max(case when
(select count(*) from company c2 where c1.departid=c2.departid and c1.payc2.pay)=0
then name
else '' end) 第一名,
max(case when
(select count(*) from company c2 where c1.departid=c2.departid and c1.payc2.pay)=1
then name
else '' end) 第二名,
max(case when
(select count(*) from company c2 where c1.departid=c2.departid and c1.payc2.pay)=2
then name
else '' end) 第三名
from company c1 group by departid order by departid
/
一楼逻辑有问题,这个SQL是先在表中取出前10行,在进行排序;
应该先对表排序,在取出前10行;
select * from a (select * from table order by xxx) a where rownum=10;
首先,来构造一些数据
drop table test;
create table test
(
name varchar2(10),
account number(5)
);
insert into test values ('张三','5');
insert into test values ('王五','10');
insert into test values ('小二','10');
insert into test values ('李四','20');
insert into test values ('小三','40');
insert into test values ('小四','50');
insert into test values ('小五','90');
insert into test values ('小六','90');
insert into test values ('小七','90');
commit;
下面来看一下一些方式的排名结果:
1. select t.*,dense_rank() over(order by t.account asc) 排名 from test t;
2. select t.*,dense_rank() over(order by t.account desc) 排名 from test t;
3. select t.*,rank() over(order by t.account asc) 排名 from test t;
4. select t.*,rank() over(order by t.account desc) 排名 from test t;
oracle查询排名可以使用排名函数。
比如:RANK DENSE_RANK
参考语句:
--按照笔试成绩进行排名,取出前两名
select * from
(
SELECT p.writtenExam, i.stuName, i.stuClass,
RANK() OVER ( ORDER BY p.writtenExam desc ) 排名1
,DENSE_RANK() OVER ( ORDER BY p.writtenExam desc) 排名2
FROM stuInfo i
INNER JOIN stuMarks p
ON i.stuNo = p.stuNo
) f
where 排名1=2
oracle中前N条数据可用row_number来实现。
如表中数据:
现在要求按照ID倒序,取出前十位:
oracle中执行方法:
select t.id,t.name from
(select test.*,row_number() over (order by id desc) rn from test) t
where rn=10;
结果:
select user_id_a, cnt
from (select user_id_a, cnt
from table
where user_id_a = user_id
order by user_id_a desc)
where rownum 4