sql仅从第二个表中选择前3行
我只需要子表中的3条记录sql仅从第二个表中选择前3行,sql,oracle,Sql,Oracle,我只需要子表中的3条记录 CREATE TABLE project (prj_code int , prj_name varchar(255) ); CREATE TABLE task (id int , prj_code int, task_name varchar(255) ); INSERT INTO project VALUES (1,'myproj1'); INSERT INTO project VALUES (2,'myproj2'); INSERT
CREATE TABLE project
(prj_code int , prj_name varchar(255) );
CREATE TABLE task
(id int , prj_code int, task_name varchar(255) );
INSERT INTO project VALUES (1,'myproj1');
INSERT INTO project VALUES (2,'myproj2');
INSERT INTO task VALUES (1,1,'testing');
INSERT INTO task VALUES (2,1,'prod');
INSERT INTO task VALUES (3,1,'prod2');
INSERT INTO task VALUES (4,1,'testing2');
INSERT INTO task VALUES (5,2,'mytask1');
INSERT INTO task VALUES (6,2,'mytask2');
编辑:
希望透视表为每个项目检索列中的3个smallests任务ID此代码实现了这一点。您需要使用
RANK
选择3个最小的ID,然后选择透视表:
WITH tasks AS (
select
A.prj_code,
prj_name,
RANK() OVER (PARTITION BY A.PRJ_CODE ORDER BY ID ) RANK,
ID,
TASK_NAME
from task A
inner join project B
on A.PRJ_CODE = B.PRJ_CODE
order by A.prj_code)
select PRJ_CODE, prj_name, sum(T1) T1, sum(T2) T2, sum(T3) T3
from tasks A
PIVOT (max(ID) for RANK IN ('1' as T1 ,'2' as T2 ,'3' as T3 )) B
GROUP BY PRJ_CODE, prj_name
或
使用下面的代码获得任务名称
select PRJ_CODE, prj_name, max(T1) T1, max(T2) T2, max(T3) T3
from tasks A
PIVOT (max(TASK_NAME) for RANK IN ('1' as T1 ,'2' as T2 ,'3' as T3 )) B
GROUP BY PRJ_CODE, prj_name
这是一个可怕的解决方案,但我认为它说明了实现这一点的方法。我不认为有任何旋转功能,因为我不知道您运行的是什么版本的Oracle
with tasks as (
select
a.prj_code, a.prj_name,
b.id, b.task_name,
row_number() over (partition by a.prj_code order by b.id) as rn
from
project a
join task b on
a.prj_code = b.prj_code
), pivotdata as (
select
prj_code, prj_name,
case when rn = 1 then task_name end as task_1,
case when rn = 2 then task_name end as task_2,
case when rn = 3 then task_name end as task_3
from tasks
)
select
prj_code, prj_name,
max (task_1) as task_1, max (task_2) as task_2,
max (task_3) as task_3
from pivotdata
group by
prj_code, prj_name
输出:
Prj Code Prj Name Task 1 Task 2 Task 3
1 myproj1 testing prod prod2
2 myproj2 mytask1 mytask2
问题是什么?您尝试了什么?结果集应该是每个项目记录一行。对于项目表中的每个mataching记录,我需要表-task中的3条最新记录。我仍然可以看到,这是毫无疑问的。这里没有定义“第一个”和“最后一个”的概念。第一个和最后一个基于什么因素?pivot函数的很好的实用演示。