jobposition表 jobinfo表
id pid name needmajorids
22 -1 营销学 -1
23 22 营销管理专业 22
24 22 营销xxx专业 23
25 22 营销xxxx专业 26
26 -1 农业类 28
27 26 农学 27
28 26 园艺 -1如果needmajorids 是22 则存的是id 为22的值;如果needmajorids 是23 则存的虽是id 为23的值,但我要根据根据id(23) 存其对应的pid(22)的值 ;如果needmajorids 是27 则存的虽是id 为27的值,但我要根据根据id(27) 存其对应的pid(26)的值 等,如果这样的话:此时以pid排序为 22,22,26 .最后去掉重复的取前十位!例如:专业为22,22,26,27,28,28,29,30,31,32,33,35,36 ,排序取前十位后为22,26,27,28,29,30,31,32,33,35
我现在写了一部分感觉,不知对不对:
String SELECT="select * from (select pid,num,rownum qbcRownum from (select pid , count(id) num from MajorInfo where pid in (select needmajorids from jobinfo where needmajorids!=-1 and isenable=1 and CompanyId in (select id from CompanyMember where CompMemLevelId!=1 and CompMemLevelId!=100 and MemEndDate>sysdate and isenable=1) ) group by pid order by num desc) ) where qbcRownum>0 and qbcRownum<11 order by num desc ";帮帮忙,谢谢了,急!!!
id pid name needmajorids
22 -1 营销学 -1
23 22 营销管理专业 22
24 22 营销xxx专业 23
25 22 营销xxxx专业 26
26 -1 农业类 28
27 26 农学 27
28 26 园艺 -1如果needmajorids 是22 则存的是id 为22的值;如果needmajorids 是23 则存的虽是id 为23的值,但我要根据根据id(23) 存其对应的pid(22)的值 ;如果needmajorids 是27 则存的虽是id 为27的值,但我要根据根据id(27) 存其对应的pid(26)的值 等,如果这样的话:此时以pid排序为 22,22,26 .最后去掉重复的取前十位!例如:专业为22,22,26,27,28,28,29,30,31,32,33,35,36 ,排序取前十位后为22,26,27,28,29,30,31,32,33,35
我现在写了一部分感觉,不知对不对:
String SELECT="select * from (select pid,num,rownum qbcRownum from (select pid , count(id) num from MajorInfo where pid in (select needmajorids from jobinfo where needmajorids!=-1 and isenable=1 and CompanyId in (select id from CompanyMember where CompMemLevelId!=1 and CompMemLevelId!=100 and MemEndDate>sysdate and isenable=1) ) group by pid order by num desc) ) where qbcRownum>0 and qbcRownum<11 order by num desc ";帮帮忙,谢谢了,急!!!
id pid name
22 -1 营销学
23 22 营销管理专业
24 22 营销xxx专业
25 22 营销xxxx专业
26 -1 农业类
27 26 农学
28 26 园艺 jobinfo表
needmajorids-1
22
23
26
28
27
-1
MajorInfo表中的id就是jobinfo表下needmajorids的值
可以先得到MajorInfo父子关系,然后根据得到的父子关系查询jobinfo对应想要的值
我也没看懂你要什么数据,不过你只是要分析函数,我给你写个看下,你看能不能参考,你不是要专业前十名嘛,要并列的嘛?我那个班级前十名做下对比吧。学生表和学生成绩表。
学生表(student): 学生编号(STU_ID) 学生名称(STU_NAME)
学生成绩表(student_score_info):学生编号(STU_ID) 班级编号(CLASS_ID) 学生成绩(STU_SCORE)情况1:如果并列,不算,只管去除前十名人员,不管并列现象。
SELECT stu_id,stu_name,class_id FROM(
SELECT t1.stu_id,t1.stu_name,t2.class_id,row_number() over(
PARTITION BY t2.class_id ORDER BY t2.stu_score DESC/*按照班级分组,成绩降序排序,得到顺序号,不论是否同名,分组内部每行增加1*/
) RN
FROM student t1,student_score_info t2
WHERE t1.stu_id = t2.stu_id)
WHERE RN < 11;情况2:如果并列,也同样计算出来,比如很多分数相同的,这些人都算是前十名。
SELECT stu_id,stu_name,class_id FROM(
SELECT t1.stu_id,t1.stu_name,t2.class_id,dense_rank() over(
PARTITION BY t2.class_id ORDER BY t2.stu_score DESC/*按照班级分组,成绩降序排序,得到顺序号,同stu_score时生成序号一样,分组内部下一个stu_score增加1*/
) RN
FROM student t1,student_score_info t2
WHERE t1.stu_id = t2.stu_id)
WHERE RN < 11;情况3:这种很少使用,并列计算,但是需要跳跃下标编号,这样提取出来的前几名不好说,一般用于全量导出数据给查看排名比较多,因为排名完全是正规排名方式,而且并列的名次是编号是一样的,但是要去除前十,考虑并列的情况就不好说是什么数据了:
SELECT stu_id,stu_name,class_id FROM(
SELECT t1.stu_id,t1.stu_name,t2.class_id,rank() over(
PARTITION BY t2.class_id ORDER BY t2.stu_score DESC/*按照班级分组,成绩降序排序,得到顺序号,同stu_score时生成序号一样,遇到下一个stu_score序号增加的数量为前一个stu_score的数据行数*/
) RN
FROM student t1,student_score_info t2
WHERE t1.stu_id = t2.stu_id)
WHERE RN < 11;
oracle QQ群:54775466
期待您的一起探讨
欢迎爱好者入群学习
---------- ---------- ----------
10 KING 5000
10 CLARK 2450
10 MILLER 1300
20 SCOTT 3000
20 FORD 3000
20 JONES 2975
20 ADAMS 1100
20 SMITH 800
30 BLAKE 2850
30 ALLEN 1600
30 TURNER 1500 DEPTNO ENAME SAL
---------- ---------- ----------
30 MARTIN 1250
30 WARD 1250
30 JAMES 950已选择14行。SQL> break on deptno skip 1
SQL> select deptno,ename,sal from emp order by deptno,sal desc; DEPTNO ENAME SAL
---------- ---------- ----------
10 KING 5000
CLARK 2450
MILLER 1300 20 SCOTT 3000
FORD 3000
JONES 2975
ADAMS 1100
SMITH 800 30 BLAKE 2850 DEPTNO ENAME SAL
---------- ---------- ----------
30 ALLEN 1600
TURNER 1500
MARTIN 1250
WARD 1250
JAMES 950
已选择14行。SQL> break on ''
SQL>
--查出各部门薪水前三名的员工姓名、薪水。
SQL> select * from(
2 select deptno,rank() over(partition by deptno order by sal desc) rk,ename,sal
3 from emp
4 )
5 where rk<=3
6 / DEPTNO RK ENAME SAL
---------- ---------- ---------- ----------
10 1 KING 5000
10 2 CLARK 2450
10 3 MILLER 1300
20 1 SCOTT 3000
20 1 FORD 3000
20 3 JONES 2975
30 1 BLAKE 2850
30 2 ALLEN 1600
30 3 TURNER 1500已选择9行。SQL> select * from(
2 select deptno,dense_rank() over(partition by deptno order by sal desc) drk,ename,sal
3 from emp
4 )
5 where drk<=3
6 / DEPTNO DRK ENAME SAL
---------- ---------- ---------- ----------
10 1 KING 5000
10 2 CLARK 2450
10 3 MILLER 1300
20 1 SCOTT 3000
20 1 FORD 3000
20 2 JONES 2975
20 3 ADAMS 1100
30 1 BLAKE 2850
30 2 ALLEN 1600
30 3 TURNER 1500已选择10行。SQL>