新网创想网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
首先,来构造一些数据
创新互联自2013年起,先为温江等服务建站,温江等地企业,进行企业商务咨询服务。为温江企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
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;
按照语义正确的方法,你应该先group by和order by分数,然后再搞点花招,就可以让分数相同的人使用一样的排名了。你不应该有任何业务逻辑使得相同分数的人顺序上有差别会造成影响。
你应该说的是row_number()over 、rank()over和dense_rank()over这三种分析函数吧。后面两个就是可以存在并列的情况。 写法是 row_number()over(partition by...order by score),其他两个也一样
首先,我们在测试项目中新建一个用户控件,然后把GridControl拖到用户控件中,设置控件的Dock属性为Fill(可根据需要自行设置)。GridControl的显示效果如下图所示:
由上图可以看到,我们拖进去的控件上面显示的有一段说明性的英文文字,如果不想显示这些文字,那我们就点击RunDesigner进入属性编辑器窗体,修改OptionView下的showGroupPanel属性为False,这样,上面的提示性文字就消失了;
设置属性控制GridControl中列头的过滤器:我们只需要点击runDesign,设置OptionsCustomization下的AllowFilter属性为False,即可禁用过滤器,设为True时,可启用过滤器;
如何控制GridControl右键单击可弹出右键菜单:如果不需要右键菜单,我们可以在OptionMenu下设置其EnableColumnMenu属性为false,如若需要右键菜单,则把属性设为True即可;
在查询数据为空时,显示自定义的字符提示:当我们的查询书库为空时,我们可以在列表中设置字符提示信息,而不是弹出一个窗体提示信息,这样我们需要在gridview1_CustomDrawEmptyForwground()事件下写以下方法即可;
显示行号:使用GridControl时,我们一般在第一行显示序号便于记录数,在如果需要在第一行显示行号,那么我们可以在gridView1_CustomDrawRowIndicator(object sender, RowIndicatorCustomDrawEventArgs e)下写如下代码,即可实现显示行号的功能;
显示水平滚动条:当我们显示的列数很多时,可能用到水平滚动条,在GridControl中,显示滚动条的控制只需要设置this.gridView.OptionsView.ColumnAutoWidth = false;
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
两个办法:
先找出年级排名前十的,然后再根据班级排名即可。
把年级排名和班级排名全部列出,然后再找年级排名前十的。
相对而言第一种办法比较好,二次查询的时候相对内容要少些。
select rownum 年级排名,rank() over( partition by class_no order by score) as 班级排名, name,stu_no,class_no,score from (select name,stu_no,class_no,score from table order by score) where rownum=10.
第二种写法则是反过来,先排全年级的名次和班级名次,然后再找年级排名前十。这样做的话查询压力比较大。
select * from (select rank() over(order by score) as 年级排名,rank() over( partition by class_no order by score) as 班级排名,name,stu_no,class_no,score from table) where 年级排名=10