2011-08-30 8 views
2

트랜잭션 테이블에 대해 작업하고 있습니다. 지난 5 분, 30 분, 1,2,3, 4 시간, 1,2,5,10 일 동안 동일한 고객이 수행 한 트랜잭션 수를 결정하기 위해 여러 가지 변수를 생성하려고합니다. 트랜잭션 테이블에서 이러한 열을 생성하는 효율적인 방법은 무엇입니까? - 솔루션은 각 트랜잭션 시간까지 누계가됩니다. 내가 처분 할 수있는 Oracle 및 다른 SQL 변종있다.SQL에서 트랜잭션 활동 실행 중

+1

몇 가지 샘플 데이터를 제공하면 좋은 질문이 될 것입니다. 샘플 트랜잭션 및 샘플 출력 ... 게다가 테이블에서 물리적으로 데이터를 사용할 수 있도록 하시겠습니까? 아니면 'SELECT'또는 VIEW에서 가져 오는 것에 대해 이야기하고 있습니까? –

+1

출력이 될 것 같아요 ... 모든 주문 datetime에 대해, 예를 들어, "5 일 안에 마지막 거래 없음"열을 읽고 그 행 datetime에 상대적인 해당 기간의 주문 수를 제공합니다 . – SQLQueryR

답변

1

필자는 일시적 특성으로 인해 지속적으로 변경되므로 이러한 통계를 물리적으로 저장하지 않으려한다고 생각합니다. 솔루션은 실제로 이러한 통계를 사용하는 방법에 따라 달라집니다. 나는 두 가지 방법을 생각할 수 : 주어진 고유 한 고객

  1. 임시 쿼리 -이 경우 내가 저장 프로 시저 매개 변수로 고객 ID와 기간을 가지고, 그리고 관련 수를 반환이있을 것이다 고객 당 거래.

  2. 여러 창에서 여러 고객에 대한 '표준화 된'보고 -이 경우 적절한 기간 동안 모든 고객을 선택하고 고객 당 거래 수를 볼 수 있습니다. 아마도

당신이 우리에게 당신의 사용 사례에 대한 좀 더 많은 정보를 제공 할 수 있다면, 우리는 더 구체적으로 할 수 있습니다 .. 단일 고객에 대한

+0

나는 OP가 적절한 분석 함수 사용법에 정말로 관심이 있다고 생각한다. 예 : 'SUM (AMOUNT) OVER (PARTITION BY [user, timeframe, etc]) ' –

+0

트랜잭션은 고객 ID, 날짜 시간 주문 및 행당 기타 주문 정보로 나타납니다. StevieG, 솔루션의 정보를 기반으로 모든 고객에 대해 통계 모델링을 수행하고자하므로 두 번째 솔루션을 수행하고 있습니다. – SQLQueryR

0

:

가장 좋은 솔루션 I 분석을 사용하지 않고 하위 쿼리/공통 테이블 표현식을 사용할 수 있습니다. 오라클은 일반적으로 임시 테이블로 전환할지 여부를 알기에 충분히 똑똑하여 동일한 데이터에 대해 다중 패스 이후에가는 비용을 줄입니다.

with txns as 
     (select customer_id 
       txn_id, 
       txn_ts 
      from transaction_table 
     where customer_id = ? 
      AND txn_ts >= SYSTIMESTAMP - NUMTODSINTERVAL(10, 'DAY') 
     ) 
select customer_id, 
     (select count(*) from txns 
     where event_ts >= systimestamp - numtodsinterval(5/1440, 'day')) 
     as txn_5_min, 
     (select count(*) from txns 
     where event_ts >= systimestamp - numtodsinterval(30/1440, 'day')) 
     as txn_30_min, 
     (select count(*) from txns 
     where event_ts >= systimestamp - numtodsinterval(1/24, 'day')) 
     as txn_1_hour, 
     (select count(*) from txns 
     where event_ts >= systimestamp - numtodsinterval(2/24, 'day')) 
     as txn_2_hour, 
     (select count(*) from txns 
     where event_ts >= systimestamp - numtodsinterval(3/24, 'day')) 
     as txn_3_hour, 
     (select count(*) from txns 
     where event_ts >= systimestamp - numtodsinterval(4/24, 'day')) 
     as txn_4_hour, 
     (select count(*) from txns 
     where event_ts >= systimestamp - numtodsinterval(1, 'day')) 
     as txn_1_day, 
     (select count(*) from txns 
     where event_ts >= systimestamp - numtodsinterval(2, 'day')) 
     as txn_2_day, 
     (select count(*) from txns 
     where event_ts >= systimestamp - numtodsinterval(5, 'day')) 
     as txn_5_day, 
     (select count(*) from txns 
     where event_ts >= systimestamp - numtodsinterval(10, 'day')) 
     as txn_10_day 
    from customer 
WHERE customer_id = ?; 

효율성이 확실히 떨어질지라도 멀티 고객 사례에 대해 비슷한 구현을 사용할 수 있습니다. 모든 고객에 대해 5 분 수준의 데이터를 가져 오는 것이 완료 될 때까지이를 폐기할지 여부를 고려하십시오.