Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql oracle多表查询_Sql_Oracle_Greatest N Per Group - Fatal编程技术网

Sql oracle多表查询

Sql oracle多表查询,sql,oracle,greatest-n-per-group,Sql,Oracle,Greatest N Per Group,我有两张桌子,第一张是: contract | id | name | start | end | amount | contract_evaluation | id | contract_id | percentage date | 合同在合同评估表中可能有多条记录 我需要的是一个检索以下内容的查询: id,name,startfromcontracts==plus==(max)percentage,date在表contract\u evaluation中,这是T-SQL语法,但对于Ora

我有两张桌子,第一张是:

contract
| id | name | start | end | amount |

contract_evaluation
| id | contract_id | percentage date |
合同
合同评估
表中可能有多条记录

我需要的是一个检索以下内容的查询:


id
name
start
from
contracts
==plus==
(max)percentage
date
在表
contract\u evaluation
中,这是T-SQL语法,但对于Oracle来说应该是可用的,或者很容易修改

/* SETUP */
CREATE TABLE contract ( id int, name varchar(10), start date, end date, amount decimal(10,2) );
INSERT INTO contract (id, name, start, end, amount)
VALUES 
      (1,'Foo','1/1/2017','2/1/2017',10000.00)
    , (2,'Bar','4/1/2017','6/1/2017',20000.00)
;

CREATE TABLE contract_evaluation ( id int, contract_id int, percentage decimal(5,2), date date ) ;
INSERT INTO contract_evaluation (id, contract_id, percentage, date)
VALUES 
      (1,1,2.0,'1/1/2016')
    , (2,2,5.0,'1/1/2017')
    , (3,2,2.5,'4/2/2017')
    , (4,1,3.5,'1/2/2017')
;

/* QUERY TIME */
; WITH cte_ce AS (
    SELECT ce1.* 
    FROM (
        SELECT contract_id, percentage
            , ROW_NUMBER() OVER (PARTITION BY contract_id ORDER BY date DESC) AS rn
        FROM contract_evaluation
    ) ce1
    WHERE ce1.rn = 1
)
SELECT c.name, c.start, c.end, c.amount, cte_ce.percentage, ( c.amount + (c.amount*(COALESCE(cte_ce.percentage,0)/100)) ) AS newAmount
FROM contract c
LEFT OUTER JOIN cte_ce ON c.id = cte_ce.contract_id

我在以下脚本中找到了oracle的解决方案。这主要与Shawn的方法相同,但对oracle而言。这两种方法都主要基于分析函数RANK()OVER(按…顺序…划分)。 问题是获取与百分比相对应的cur_日期,这在简单的聚合中是不可能的

玩得开心

create table contract (    
    "ID"     number primary key,
    "NAME"   varchar2(50),     
    "START"  date,     
    "END"    date,     
    amount   number 
);

create table contract_evaluation (
   "ID"         number primary key,
   contract_id  number references contract("ID"),
   percentage   number,
   cur_date     date   
);

insert into contract values ( 1, 'contract 1', sysdate-5, sysdate-2, 500  );
insert into contract values ( 2, 'contract 2', sysdate-10, sysdate-2, 500  );
insert into contract values ( 3, 'contract 3', sysdate-8, sysdate-2, 500  );

insert into contract_evaluation values ( 1, 1, 22, sysdate-5 );
insert into contract_evaluation values ( 2, 1, 44, sysdate-4 );
insert into contract_evaluation values ( 3, 1, 100, sysdate-3 );
insert into contract_evaluation values ( 4, 2, 10, sysdate-8 );
insert into contract_evaluation values ( 5, 2, 20, sysdate-6 );
insert into contract_evaluation values ( 6, 2, 30, sysdate-5 );

select inner_select.* 
  from ( select c."ID", 
                c."NAME", 
                c."START", 
                ce.percentage,
                ce.cur_date,
                rank() over (partition by contract_id order by percentage desc) as rnk
           from contract c
      left join contract_evaluation ce on ce.CONTRACT_ID = c."ID" ) inner_select
  where inner_select.rnk = 1

/*
drop table contract_evaluation;
drop table contract;
*/

你对你尝试过的东西有什么特别的问题吗?