트랜잭션 테이블에 대해 작업하고 있습니다. 지난 5 분, 30 분, 1,2,3, 4 시간, 1,2,5,10 일 동안 동일한 고객이 수행 한 트랜잭션 수를 결정하기 위해 여러 가지 변수를 생성하려고합니다. 트랜잭션 테이블에서 이러한 열을 생성하는 효율적인 방법은 무엇입니까? - 솔루션은 각 트랜잭션 시간까지 누계가됩니다. 내가 처분 할 수있는 Oracle 및 다른 SQL 변종있다.SQL에서 트랜잭션 활동 실행 중
답변
필자는 일시적 특성으로 인해 지속적으로 변경되므로 이러한 통계를 물리적으로 저장하지 않으려한다고 생각합니다. 솔루션은 실제로 이러한 통계를 사용하는 방법에 따라 달라집니다. 나는 두 가지 방법을 생각할 수 : 주어진 고유 한 고객
임시 쿼리 -이 경우 내가 저장 프로 시저 매개 변수로 고객 ID와 기간을 가지고, 그리고 관련 수를 반환이있을 것이다 고객 당 거래.
여러 창에서 여러 고객에 대한 '표준화 된'보고 -이 경우 적절한 기간 동안 모든 고객을 선택하고 고객 당 거래 수를 볼 수 있습니다. 아마도
당신이 우리에게 당신의 사용 사례에 대한 좀 더 많은 정보를 제공 할 수 있다면, 우리는 더 구체적으로 할 수 있습니다 .. 단일 고객에 대한
나는 OP가 적절한 분석 함수 사용법에 정말로 관심이 있다고 생각한다. 예 : 'SUM (AMOUNT) OVER (PARTITION BY [user, timeframe, etc]) ' –
트랜잭션은 고객 ID, 날짜 시간 주문 및 행당 기타 주문 정보로 나타납니다. StevieG, 솔루션의 정보를 기반으로 모든 고객에 대해 통계 모델링을 수행하고자하므로 두 번째 솔루션을 수행하고 있습니다. – SQLQueryR
:
가장 좋은 솔루션 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 분 수준의 데이터를 가져 오는 것이 완료 될 때까지이를 폐기할지 여부를 고려하십시오.
- 1. SQL에서 평점의 실행 중 합계 생성
- 2. 다른 활동 방법에서 활동 UI 업데이트 중?
- 3. SQL에서 조건부로 WHERE 절 실행
- 4. EXE 서버에서 실행 중
- 5. Android : 배경에서 활동 실행
- 6. 활동 계속 실행 - Android
- 7. SQL 트랜잭션 ROLLBACK을 실행할 때 실행 중지
- 8. 트랜잭션 중 제약 조건 해제
- 9. 활동 변경 중 Android에서의 영향
- 10. 회원 활동 추가 중? (레일)
- 11. Spring과 Hibernate와의 장기 실행 트랜잭션?
- 12. PHP - MySQL의 트랜잭션 실행 오류
- 13. Spring 트랜잭션 어노테이션 - 성공시 실행
- 14. 숨겨진 스텔스 모드에서 활동 실행
- 15. 안드로이드 활동 중 배경 서비스 중지
- 16. 오라클의 동적 SQL에서 결과를 얻는 중
- 17. SSIS : 데이터 동시 이동 중 트랜잭션
- 18. 실행 중 워크 플로우 표시
- 19. SQL에서 Select를 사용하여 업데이트를 사용 중
- 20. PL/SQL에서 연관 배열 재설정 중?
- 21. iPhone 앱 실행 중 또는 실행 중 오류 발생
- 22. IIS에서 실행 중 오류보고
- 23. 실행 중 자기 삭제
- 24. FileNotFoundException NUnit을 실행 중
- 25. 에서 프로세스를 실행 중 #
- 26. Sax 파서를 실행 중
- 27. 실행 중 오류가 발생했습니다.
- 28. cmd에서 항아리를 실행 중
- 29. 우분투에서 Windows를 실행 중
- 30. 트랜잭션 중에 여러 연결을 커밋하는 중
몇 가지 샘플 데이터를 제공하면 좋은 질문이 될 것입니다. 샘플 트랜잭션 및 샘플 출력 ... 게다가 테이블에서 물리적으로 데이터를 사용할 수 있도록 하시겠습니까? 아니면 'SELECT'또는 VIEW에서 가져 오는 것에 대해 이야기하고 있습니까? –
출력이 될 것 같아요 ... 모든 주문 datetime에 대해, 예를 들어, "5 일 안에 마지막 거래 없음"열을 읽고 그 행 datetime에 상대적인 해당 기간의 주문 수를 제공합니다 . – SQLQueryR