2014-06-18 2 views
1

확실하지 제목이 적합하지만, 여기 내 문제의 경우 : 나는 다음과 같은 테이블이 있습니다 모든 내용은최소(), 날짜 부분 집합 내에서 최대()

create table OpenTrades(
AccountNumber number, 
SnapshotTime date, 
Ticket   number, 
OpenTime  date, 
TradeType  varchar2(4), 
TradeSize  number, 
TradeItem  char(6), 
OpenPrice  number, 
CurrentAsk  number, 
CurrentBid  number, 
TradeSL   number, 
TradeTP   number, 
TradeSwap  number, 
TradeProfit  number 
); 
alter table OpenTrades add constraint OpenTrades_PK Primary Key (AccountNumber, SnapshotTime, Ticket) using index tablespace MyNNIdx; 

(SnapshotTime, 계정), 내가 원하는 resultimg min 및 max가 SnapshotTime과 관련하여 과거에 비례하는 방식으로 min (OpenPrice), max (OpenPrice)를 선택하십시오. 예를 들어, 가능한 모든 (계정, tradeitem) 쌍에 대해 SnapshotTime = 10-jun 및 openprice가 0.9에서 2.0 사이 인 10 개의 레코드와 SnapshotTime = 11-jun 및 openprice 사이에 10 개의 레코드가있을 수 있습니다 1.0 및 2.1뿐만 아니라 SnapshotTime = 12-jun 및 openprice가 0.7에서 1.9 사이 인 레코드가 10 개 더 있습니다.

AccountNumber SnapshotTime MyMin MyMax 
------------- ------------ ----- ----- 
1234567  10-jun  0.9  2.0 
1234567  11-jun  0.9  2.1 
1234567  12-jun  0.7  2.1 

내가 이미 시도했지만, 그것은 단지 같은 snapshottime 내 분() 및 최대()를 반환합니다 : 같은 시나리오에서 는 노력 쿼리는 다음과 같이 뭔가를 반환해야합니다

select accountnumber, snapshottime, tradeitem, min(openprice), max(openprice) 
from opentrades 
group by accountnumber, snapshottime, tradeitem 

도움이 될 것입니다.

답변

0

이 질문에 대한 대답은 있습니까?

select ot1.accountnumber, ot1.snapshottime, ot1.tradeitem, 
     min(ot2.openprice), max(ot2.openprice) 
from opentrades ot1, opentrades ot2 
where ot2.accountnumber = ot1.accountnumber 
    and ot2.tradeitem = ot1.tradeitem 
    and ot2.snapshottime <= ot1.snapshottime 
group by ot1.accountnumber, ot1.snapshottime, ot1.tradeitem 
+0

답장을 보내 주셔서 감사합니다. 그러나이 쿼리는 영원히 실행될 것으로 보인다. 그들이 올 때 결과를 볼 것입니다 ... – gcaglion

1

당신은 윈도우 절과 함께,이에 대한 min()max()analytic versions를 사용할 수 있습니다

select distinct accountnumber, snapshottime, tradeitem, 
    min(openprice) over (partition by accountnumber, tradeitem 
    order by snapshottime, openprice 
    rows between unbounded preceding and current row) as min_openprice, 
    max(openprice) over (partition by accountnumber, tradeitem 
    order by snapshottime, openprice desc 
    rows between unbounded preceding and current row) as max_openprice 
from opentrades 
order by accountnumber, snapshottime, tradeitem; 

ACCOUNTNUMBER SNAPSHOTTIME TRADEITEM MIN_OPENPRICE MAX_OPENPRICE 
------------- ------------ --------- ------------- ------------- 
     1234567 10-JUN-14 X     .9    2 
     1234567 11-JUN-14 X     .9   2.1 
     1234567 12-JUN-14 X     .7   2.1 

SQL Fiddle합니다.

partition byrows between 절을 기반으로 행의 하위 집합에서 현재 accountnumbertradeitem의 값을 계산합니다. order by은 각 스냅 샷의 행을 현재 스냅 샷의 가장 낮은 값 (min) 또는 가장 높은 값 (desc이기 때문에 max)으로보고, 각 행에 대해 적절한 최소/최대를 계산할 때만 의미합니다.

분석 결과는 모든 행에 대해 계산됩니다. distinct없이 실행하면 모든 기본 데이터와 각 스냅 샷 (Fiddle)에 대해 동일한 최소/최대를 볼 수 있습니다. 다양한 데이터를 원하지 않으므로 distinct을 사용하여 복제를 억제하거나 row_number()을 사용하여 쿼리를 필터링하여 필터링 할 수 있습니다.

+0

대단히 감사합니다. 그게 실제로 내 필요에 대답 한 것처럼 보입니다. 오라클의 분석 기능에 익숙해 져야합니다 ... – gcaglion