2014-07-12 1 views
2

MS 액세스 쿼리 질문.시간 내에 특정 값에서 개수가 변경됩니다.

단순화 된 버전에서는 ticketid 열, 상태 열 및 타임 스탬프 열이 포함 된 테이블이 있습니다. 타임 스탬프 열은 티켓에 (새로운) 상태가 설정된시기를 나타냅니다.

최종 목표는 특정 시간 프레임 내에서 상태 FROM 상태 18을 변경 한 티켓 수를 계산하는 것입니다. 여기에는 시간 프레임 내에 상태 18이 있고 다시 '손실'된 티켓뿐만 아니라 시간 프레임의 시작 부분에 이미 상태 18이있는 티켓도 포함됩니다.

아래의 중간 쿼리는 너무 많은 레코드를 반환하므로 분명히 정확하지 않습니다. 그것은 다음 기록 (시간)과 비교할뿐만 아니라 어떤 기록과도 비교됩니다.

SELECT * 
    FROM 
(SELECT tkhtimestamp, tkhticketid, tkhstatusid FROM tickethistory WHERE tkhstatusid NOT IN  (18) AND tkhtimestamp >= #3-jul-2014 9:00:00# AND tkhtimestamp <= #4-jul-2014 9:00:00#) AS new_status_records 
    INNER JOIN 
(SELECT tkhtimestamp, tkhticketid, tkhstatusid FROM tickethistory WHERE tkhstatusid IN (18) AND tkhtimestamp <= #4-jul-2014 9:00:00#) AS old_status_records 
    ON old_status_records.tkhticketid = new_status_records.tkhticketid AND old_status_records.tkhtimestamp < new_status_records.tkhtimestamp 

누구든지이 작업을 수행 할 수 없으므로 조언을받을 수 있습니까? max/min 및 group by을 사용한 다른 노력도 실패했습니다.

감사합니다.

답변

0

당신은 MAX/MIN과 GROUP BY를 사용할 때 올바른 생각을 가졌습니다. [tickethistory]의 테스트 데이터에 대한

다음 쿼리는 각 티켓의 새 역사 기록에 대한 현재 및 이전 타임 스탬프를 추출합니다
tkhtimestamp   tkhticketid tkhstatusid 
------------------- ----------- ----------- 
2014-07-02 10:00:00   1   10 
2014-07-02 12:00:00   2   18 
2014-07-03 13:30:00   1   18 
2014-07-03 13:35:00   1   99 
2014-07-03 15:00:00   2   99 

:

SELECT 
    curr.tkhticketid, 
    curr.tkhtimestamp AS curr_timestamp, 
    MAX(prev.tkhtimestamp) AS prev_timestamp 
FROM 
    tickethistory curr 
    INNER JOIN 
    tickethistory prev 
     ON curr.tkhticketid = prev.tkhticketid 
      AND curr.tkhtimestamp > prev.tkhtimestamp 
GROUP BY  
    curr.tkhticketid, 
    curr.tkhtimestamp 

그것은

tkhticketid curr_timestamp  prev_timestamp  
----------- ------------------- ------------------- 
      1 2014-07-03 13:30:00 2014-07-02 10:00:00 
      1 2014-07-03 13:35:00 2014-07-03 13:30:00 
      2 2014-07-03 15:00:00 2014-07-02 12:00:00 

을 반환 우리 이를 다시 [tickethistory] 테이블 (2 회)에 결합하여 현재 및 이전 상태 값을 검색 할 수 있습니다.

SELECT 
    tkh_curr.tkhticketid, 
    tkh_curr.tkhtimestamp AS curr_timestamp, 
    tkh_curr.tkhstatusid AS curr_status, 
    tkh_prev.tkhtimestamp AS prev_timestamp, 
    tkh_prev.tkhstatusid AS prev_status 
FROM 
    (
     (
      SELECT 
       curr.tkhticketid, 
       curr.tkhtimestamp AS curr_timestamp, 
       MAX(prev.tkhtimestamp) AS prev_timestamp 
      FROM 
       tickethistory curr 
       INNER JOIN 
       tickethistory prev 
        ON curr.tkhticketid = prev.tkhticketid 
         AND curr.tkhtimestamp > prev.tkhtimestamp 
      GROUP BY  
       curr.tkhticketid, 
       curr.tkhtimestamp 
     ) curr_prev 
     INNER JOIN 
     tickethistory tkh_curr 
      ON tkh_curr.tkhticketid = curr_prev.tkhticketid 
       AND tkh_curr.tkhtimestamp = curr_prev.curr_timestamp 
    ) 
    INNER JOIN 
    tickethistory tkh_prev 
     ON tkh_prev.tkhticketid = curr_prev.tkhticketid 
      AND tkh_prev.tkhtimestamp = curr_prev.prev_timestamp 

당신은 당신이 당신이 필요로하는 특정 정보를 꺼내 이에 대해 다른 쿼리를 실행할 수 있어야합니다 [qryTicketHistoryChanges] 같은 이름을 가진 Access에서 해당 쿼리를 저장하면

tkhticketid curr_timestamp  curr_status prev_timestamp  prev_status 
----------- ------------------- ----------- ------------------- ----------- 
      1 2014-07-03 13:30:00   18 2014-07-02 10:00:00   10 
      1 2014-07-03 13:35:00   99 2014-07-03 13:30:00   18 
      2 2014-07-03 15:00:00   99 2014-07-02 12:00:00   18 

반환.

+0

참으로 인상적이고 잘 설명 된 답변 Gord! 고맙습니다. – David

관련 문제