2014-05-21 4 views
0

사용자가 이메일을 열지 만 일주일 동안 이메일을 열지 않은 빈도를 파악하려고합니다. 쿼리는 다음과 유사합니다.하나의 열에서 주문중인 이전 행이 어떤 조건을 만족시키는 행을 선택하십시오.

select * from user_email_tracking uet1 where opened_timestamp is not null and 
    select(max(opened_timestamp) from user_email_tracking where user_id = uet1.user_id 
    and opened_timestamp < uet1.opened_timestamp 

중첩 된 선택을 표시하더라도 너무 비효율적입니다. 이것은 다소 큰 테이블입니다. 지금 제가하고있는 논리는 아마 충분히 좋지 않을 것입니다. 필자가 염두에 두어야 할 대각선 아래에서 실제 전체 데카르트 조인을 기본적으로 수행해야하기 때문입니다.

답변

0

당신이 찾고있는 무슨 상관 하위 쿼리는 다음과 같이이다 :

select * 
from user_email_tracking uet 
where opened_timestamp is not null and 
     not exists (select 1 
        from user_email_tracking uet2 
        where uet2.user_id = uet.user_id and 
         uet2.opened_timestamp >= date_add(uet1.opened_timestamp, interval -7 day) 
       ); 

내가 timestamp 날짜 연산을 수행의 편의를 위해 datetime 것으로 가정.

최상의 성능을 얻으려면 user_email_tracking(user_id, user_email_tracking)에 대한 인덱스가 필요합니다.

+0

음, "하나의 솔루션은 상관 된 하위 쿼리입니다 ..."위의 – Strawberry

+0

과 같이 상관 관계 단계에서 블랭킹되었지만 충분히 효율적이지 않습니다. – djechlin

관련 문제