2013-10-08 4 views
1

나는 논리를 설명하려고 시도하고 누군가가 나를 이해하고 도움을 줄 수 있기를 바랍니다.날짜 추가 간격

효과적으로 데이터베이스 내에서 계정을 처음 생성 한 후 120 일 이내에 거래를 중단했지만 마지막 거래 이후 120 일 동안 비활성 상태 인 사용자를 찾고 있습니다.

기본적으로 누군가가 120 일 동안 거래 한 다음 3 년 후 다시 거래하면이 목록에 포함시켜야합니다. 따라서 max(transaction.created_at)을 사용하면 효과가 없습니다.

잘만 설명해 주셨으면합니다.

+0

모든 거래가 발생합니다. 거래 날짜를 저장하고 있습니까? – Jhanvi

+0

테이블 구조를 추가하십시오. –

+0

created_at에 의한 간단한 순서가 아님 desc limit 1 offset 1? –

답변

1

는 당신이 첫 번째 단계는

select t.*, 
@curRow := @curRow + 1 AS row_number 
from transaction t 
JOIN (SELECT @curRow := 0) r 
order by user, timestamp 

결과

user, timestamp, row_id 
1  t1   1 
1  t1+x   2 
... 

다음 단계로 연속 작업을 가입하는 것입니다 올바른 순서로 정렬됩니다

table transaction 
    user; Timestamp 

유형의 로그가 있다고 가정 같은 사용자

012 33,

결과 :

user timestamp row user timestamp row 
1  t1  1 1  t1+x 2 
2  t1+x 2 1 t1+x+x2 3 
... 

지금 당신은 이벤트 지금

select * from 
     (select t.*, 
     @curRow := @curRow + 1 AS row_number 
     from transaction t 
     JOIN (SELECT @curRow := 0) r 
     order by user, timestamp) a 
    inner join 
     (select t.*, 
     @curRow := @curRow + 1 AS row_number 
     from transaction t 
     JOIN (SELECT @curRow := 0) r 
     order by user, timestamp)b 
    on a.user=b.user and a.row_id=b.row_id+1 
WHERE datediff(b.timestamp, a.timestamp)>120 

당신이 거래 경우를 사이 1백20일보다 긴 휴식을 가지고 사용자의 lsit이 사이의 시간 간격에 의해 필터링해야 acc를 만들 처음 며칠 이내에이 작업이 필요하다면 where user in(select user from .... where datediff(min(timestamp, creation_Date)<120)을 추가하거나 user_id에 내부 조인을 수행하여 해당 하위 쿼리로 필터링

+0

답장을 보내 주셔서 감사합니다! 나는이 모든 것을 이해하는 데 어려움을 겪고 있기 때문에 분명히 뒤에 waaaaaaaay입니다. 죄송합니다,이 소리가 어리석은 경우, 정확히 "@curRow"는 무엇입니까? –

+0

이 코드로 구문 오류가 계속 발생합니다. @curRow 이후의 ":"은 오류를 일으키고 JOIN (Select ...) 행 다음에 또 다른 구문 오류가 있습니다. –

+0

두 번째 currow 쿼리는 postgres가 아닌 mysql에서 작동합니다. Postgres는 올바르게 호출 한 경우 row_number()를 사용하므로 하위 쿼리 woudl이 "사용자, 타임 스탬프에 따라 테이블 순서에서 t, * select row_number()"와 같이 보이게됩니다. 사용중인 DB에 대해 언급하지 않았고, 하나는 복잡 할 것이다 : D – AdrianBR