2017-12-10 20 views
0

사용자 트랜잭션 목록이 있습니다. 각 사용자는 여러 트랜잭션을가집니다. 다음 코드를 작성하여 사용자의 가장 최근 트랜잭션을 찾은 다음 지난 7 일 이상 거래를하지 않은 사용자를 선택하지만 내 코드의 시간 복잡도가 무엇인지 알지 못합니다. 누군가 내 코드의 시간 복잡성을 어떻게 풀어 낼 수 있는지 설명 할 수 있습니까?다음 SQL 코드의 시간 복잡성을 어떻게 해결할 수 있습니까?

trans_date는 거래 날짜입니다. 여기

select user_id,_date,datediff(curdate(),_date) 
from(
     select t1.send_id as user_id,from_unixtime(t1.trans_date) as _date 
     from transactionhistory as t1 
     where from_unixtime(t1.trans_date) = 
        (select max(from_unixtime(t2.trans_date))  
        from transactionhistory as t2 
        where t2.send_id = t1.send_id)) as tab   
where datediff(curdate(),_date) > 7; 

는 EXPLAIN 명령

see image here

+0

첫 번째 단계는 시스템에 쿼리 실행 계획을 설명하는 것입니다. 어떤 환경에서 뛰고 있습니까? Hadoop 인 경우 EXPLAIN 명령을 사용하고 결과를 질문에 추가하십시오. – Richard

+0

@ 리차드 내 질문에 EXPLAIN 명령의 출력을 추가했습니다. 그것은 SQL 서버 환경입니다. 지금 시간 복잡성을 운동하는 것을 도와 주실 수 있습니까? – Behroz

답변

0

의 출력이 쿼리 정확입니까?

사용자 당 처리하려면 가장 안쪽의 쿼리는 from ... t2 where t2.send_id = t1.send_id이어야합니다. 그렇지 않은 경우 전체 트랜잭션이 가장 최신 인 단일 사용자의 최신 레코드 만 선택합니다.

나는 그것이 O (n^2) 일 것이라고 생각한다. 외부 O (n) 루프 및 내부 O (n) 루프.

+0

네 말이 맞다! 질문 세부 사항을 편집하는 동안 실수로 해당 행을 삭제했습니다. 나는 그것을 지금 다시 추가했다. – Behroz